Некорректно работает лимит вызова на дуэль

Сообщения
112
Реакции
26
Ошибка
Ошибок никаких не выдает. Не при компиляции, не в логах
ОС
Windows
Amx Mod X
AMX Mod X 1.9.0.5241 (http://www.amxmodx.org)
Authors:
David "BAILOPAN" Anderson, Pavol "PM OnoTo" Marko
Felix "SniperBeamer" Geyer, Jonny "Got His Gun" Bergstrom
Lukasz "SidLuke" Wlasinski, Christian "Basic-Master" Hammacher
Borja "faluco" Ferrer, Scott "DS" Ehlert
Compiled: Jan 30 2019 07:09:20
Built from: https://github.com/alliedmodders/amxmodx/commit/21100375
Build ID: 5241:21100375
Core mode: JIT+ASM32
Билд
Protocol version 48
Exe version 1.1.2.7/Stdio (cstrike)
ReHLDS version: 3.4.0.669-dev
Build date: 18:21:09 Mar 29 2019 (1812)
Build from: https://github.com/dreamstalker/rehlds/commit/f6822e3
ReGamedll
ReGameDLL version: 5.7.0.329-dev
Build date: 10:47:52 Apr 17 2019
Build from: https://github.com/s1lentq/ReGameDLL_CS/commit/8c85aee
Версия Metamod
Metamod v1.21p38 2018/02/11 (5:13)
by Will Day
http://www.metamod.org/
Patch: Metamod-P (mm-p) v38
by Jussi Kivilinna
http://metamod-p.sourceforge.net/
compiled: Feb 11 2018, 10:55:08 EET (optimized)
Список метамодулей
[1] Reunion RUN - reunion_mm.dll v0.1.0.9 ini Start Never 
[2] ReAuthCheck RUN - reauthcheck_mm.d v0.1.6 ini Start Never
[3] Rechecker RUN - rechecker_mm.dll v2.5 ini Chlvl ANY
[4] Ultimate Unprec RUN - ultimate_unpreca v0.3 Alp ini ANY ANY
[5] SafeNameAndChat RUN - safenameandchat. v1.1 ini ANY ANY
[6] VoiceTranscoder RUN - voicetranscoder. v2017RC3 ini ANY ANY
[7] AMX Mod X RUN - amxmodx_mm.dll v1.9.0.5 ini Start ANY
[8] mmtimer RUN - mmtimer.dll v1.6 ini ANY Never
[9] ReSemiclip RUN - resemiclip_mm.dl v2.3.9 ini Chlvl ANY
[10] MySQL RUN - mysql_amxx.dll v1.9.0.5 pl7 ANY ANY
[11] SQLite RUN - sqlite_amxx.dll v1.9.0.5 pl7 ANY ANY
[12] VTC AMXX API RUN - vtcapi_amxx.dll v2017 RC pl7 ANY ANY
[13] CStrike RUN - cstrike_amxx.dll v1.9.0.5 pl7 ANY ANY
[14] ReAPI RUN - reapi_amxx.dll v5.8.0.1 pl7 ANY Never
[15] FakeMeta RUN - fakemeta_amxx.dl v1.9.0.5 pl7 ANY ANY
[16] hackdetector RUN - hackdetector_amx v0.15.32 pl7 ANY ANY
[17] Engine RUN - engine_amxx.dll v1.9.0.5 pl7 ANY ANY
[18] Ham Sandwich RUN - hamsandwich_amxx v1.9.0.5 pl7 ANY ANY
[19] Fun RUN - fun_amxx.dll v1.9.0.5 pl7 ANY ANY
19 plugins, 19 running
Список плагинов
[ 1] Citygate Info 1.3 Rockon allinfo.amxx ru
nning
[ 2] AdminLogs 1.2 pirvu adminlogs.amxx ru
nning
[ 3] Choose Team Fix 1.0 Makzz ChooseTeamFix.a ru
nning
[ 4] Team Select 1.5.0 F@nt0M join_team.amxx de
bug
[ 5] GameName Changer 1.0 neugomon gamename_change ru
nning
[ 6] HudTextArgs Blocker 1.1 joaquimandrade hud_text_blocke ru
nning
[ 7] [ReAPI] Block 'Fire in 0.0.1 sergrib reapi_block_FIT ru
nning
[ 8] Replace Info Message 2.3 maeStro aka 9iky replace_info_ms ru
nning
[ 9] Multi-Lingual System 1.8.3-Re AMXX Dev Team multilingual.am ru
nning
[ 10] Entity Remover 0.4 Exolent entity_remover. ru
nning
[ 11] Steam Money Fix 1.0.0 F@nt0M (tnx fl0w steam_money_fix ru
nning
[ 12] Anti net_graph 2 1.0 Seroff net_graph.amxx ru
nning
[ 13] NickName Control 1.0.1 gyxoBka nickname_contro ru
nning
[ 14] SteamID Limiter 0.4 Mistrick steamid_limiter ru
nning
[ 15] HackDetector 0.15.lite Lev @ AGHL.RU De hackdetector.am ru
nning
[ 16] Anti-Cheat 15 Proffi / Seroff FPS.amxx ru
nning
[ 17] amx_kickmenu reasons a 0.3a Beta Flash kickmenu_reason de
bug
[ 18] FreshBans 1.4.0b kanagava fresh_bans.amxx ru
nning
[ 19] Ban Sound: Fresh Bans 1.0 Leo_[BH] fb_ban_sound.am ru
nning
[ 20] Ultimate Chats Control 4.7 neygomon ucc.amxx de
bug
[ 21] UCC Addon: VoteGAG 1.2 neygomon ucc_votegag.amx ru
nning
[ 22] Warnings 0.0.3 beta Subb98 warnings.amxx de
bug
[ 23] Players Menu 1.7 neugomon players_menu.am ru
nning
[ 24] Lite Admin ESP 1.0 neygomon admin_esp.amxx ru
nning
[ 25] Yet Another Voteban 1.8 AndrewZ/voed lite_voteban.am ru
nning
[ 26] MG Grab 1.0 Nickron grab.amxx ru
nning
[ 27] Admin Fire 1.0.0 f117bomb amx_fire.amxx ru
nning
[ 28] Invisible Spectator 1.0 ReHLDS Team invisible_spect ru
nning
[ 29] Admin Base (NoName) 1.8.3-Re AMXX Dev Team admin.amxx ru
nning
[ 30] Slots Reservation 1.2 pUzzlik admin_slots.amx ru
nning
[ 31] CSSB Add Menu Client A 1.0 CSSB menus.amxx de
bug
[ 32] Admin Votes 1.8.3-dev+ AMXX Dev Team adminvote.amxx ru
nning
[ 33] Commands Menu 1.8.3-dev+ AMXX Dev Team cmdmenu.amxx ru
nning
[ 34] block_changelevel 0.4 vsf_fg5 block_changelev ru
nning
[ 35] Maps Menu 1.4.1 neugomon mapsmenu.amxx ru
nning
[ 36] Admin Voice Chat 0.2 mx?! admin_voice_cha ru
nning
[ 37] resetscore(ReAPI) 1.0 Phantom resetscore.amxx ru
nning
[ 38] Server Choose Extended 1.0.2 Radius server_choose_e ru
nning
[ 39] Automatic Unstuck 1.5 NL)Ramon(NL stuck.amxx ru
nning
[ 40] lite screen fade 1.0 AcE re_lite_screen_ ru
nning
[ 41] HUD Customizer 0.4 0.4 Igoreso hud_customizer. ru
nning
[ 42] Camera Changer 1.0 XunTric camera.amxx ru
nning
[ 43] Remove Corpses 0.0.1 Vaqtincha remove_corpses. ru
nning
[ 44] Parachute Lite [ReAPI] 11.0 Leo_[BH] parachute_lite. ru
nning
[ 45] Yekta's Combo Sprite 1.5 Yek'-ta yek_combosprite ru
nning
[ 46] Custom Smoke 1.07 bionext custom_smoke.am ru
nning
[ 47] Models Replacement 0.0.2 ConnorMcLeod | V models_replacem ru
nning
[ 48] WeaponState Remember 0.0.4 Vaqtincha weaponstate_rem ru
nning
[ 49] Bullet Whizz 1.4 Cheap_Suit Bullet_Whizz.am ru
nning
[ 50] Say me and Say hp 1.4 neygomon sayme.amxx ru
nning
[ 51] TimeLeft 1.8.3-Re AMXX Dev Team timeleft.amxx ru
nning
[ 52] Reklama 30.11.2018 mx?! reklama.amxx ru
nning
[ 53] Lite Recoder 1.0.1 neygomon Lite_DemoRecode ru
nning
[ 54] Book Service 1.0 Seroff books_amx.amxx ru
nning
[ 55] Motd 1.0 bublik contact.amxx runnin
g
[ 56] Info and News 21.01.2018 TuMon info.amxx ru
nning
[ 57] StandUp File 0.1 Subb98/Halyavshi StandUp_File.am de
bug
[ 58] Amx Who 27.04.18 NoName info_players.am ru
nning
[ 59] [Amx] MotdSystem 04.08.2016 NoName Amx_MotdSystem. ru
nning
[ 60] Server Rules 2.4b Shidla ServerRules.amx ru
nning
[ 61] RatingMap 31.10.2018 NoName amx_ratingmap.a de
bug
[ 62] Opros System 17.11.2018 NoName amx_opros_test. ru
nning
[ 63] Damager 0.0.5 steelzzz damager.amxx ru
nning
[ 64] Whose the weapon? 2.1 Yek'-ta WhoseTheWeapon. ru
nning
[ 65] Stats Configuration 1.8.3-Re AMXX Dev Team statscfg.amxx ru
nning
[ 66] CSStatsX SQL 0.7.4+1 serfreeman1337 csstatsx_sql.am de
bug
[ 67] [ReAPI] Top Awards 1.0 Dom1no_[KZ] top_awards.amxx ru
nning
[ 68] AES: Status Info 0.1 serfreeman1337 aes_status_info ru
nning
[ 69] AES: StatsX 0.5.9 [REA serfreeman1337/s aes_statsx_cstr ru
nning
[ 70] Advanced Experience Sy 0.5.9 [REA serfreeman1337/s aes_main.amxx ru
nning
[ 71] AES: CStrike Addon 0.5.9 [REA serfreeman1337/s aes_exp_cstrike ru
nning
[ 72] AES: Informer 0.5.9 [REA serfreeman1337/s aes_informer.am de
bug
[ 73] Map Manager: Core 3.0.0 Mistrick map_manager_cor ru
nning
[ 74] Map Manager: Scheduler 0.1.0 Mistrick map_manager_sch ru
nning
[ 75] Map Manager: Nominatio 0.0.8 Mistrick map_manager_nom ru
nning
[ 76] Map Manager: Rtv 0.0.4 Mistrick map_manager_rtv ru
nning
[ 77] Map Manager: Informer 0.0.5 Mistrick map_manager_inf ru
nning
[ 78] Money System 1.0.1 the_hunter money_system.am ru
nning
[ 79] Ruletka 0.1 Nordic Warrior ruletka.amxx ru
nning
[ 80] Donate Money 1.0 Chrescoe1 donatemoney.amx ru
nning
[ 81] Grenade Touch Damage 1.3 xPaw GrenadeTouchDmg ru
nning
[ 82] AlMod's Grenades Limit 1.3 AlMod almod_grenades. ru
nning
[ 83] Pop Grenades [ReAPI] 2. EFFx & HamletEag csgo_pop_grenad ru
nning
[ 84] Mode 2x2 2.5re s1lent mode.amxx ru
nning
[ 85] Drop Pistols on Death 0.0.4 Vaqtincha reapi_dead_pist ru
nning
[ 86] Custom Radio TH 1.0.2 the_hunter custom_radio.am de
bug
[ 87] [ReAPI] No Team Flash 0.0.2 Vaqtincha no_team_flash.a ru
nning
[ 88] [ReAPI] AWPoff 1.3 PAffAEJIkA :3 awp_off.amxx ru
nning
[ 89] Bot Features 0.0.3 Vaqtincha BotFeatures.amx ru
nning
[ 90] Items Restrict Ultimat 0.0.4 Vaqtincha items_restrict_ ru
nning
[ 91] Give Equipment 1.6.1 d3m37r4 give_equipment. ru
nning
[ 92] Knife Duel with Telepo 1.2 neygomon knife_duel.amxx ru
nning
[ 93] CT Bomb Cracker 0.0.4 Vaqtincha re_ct_bomb_crac de
bug
[ 94] [ReAPI] C4 Drop 0.9 a2 & F@nt0M c4_drop.amxx ru
nning
[ 95] Chat Manager 1.1.1-11 Mistrick chatmanager.amx ru
nning
[ 96] Chat Manager: Addon 0.0.4-70 Mistrick chatmanager_add ru
nning
96 plugins, 96 running
Автор плагина
neygomon (дополнения дописывал я)
Версия плагина
1.2
Исходный код
#include <amxmodx>
#include <reapi>

/* Начало настроек */
/*
* Здесь необходимо менять значения
* Где нет значений, функции можно отключать
* Для отключения просто закомментируйте строку
*/
#define HITWALL 4 // Сколько раз надо по стене ударить, чтобы вызвать дуель
#define VOTETODUEL 10 // Через сколько секунд считать, что противник зассал

#define RANDOM_START_HP // случайное стартовое здоровье каждую дуэль (каждому выставляется разное)
#define SETAIMONOPP // Разворачивать игроков друг к другу лицом
//#define ANNOUNCE // Показывать сообщение, когда остаются игрока 1 х 1
#define SOUND // проигрывать звуки показа меню, согласия и отказа
#define LIMIT // ограничения по числу раз вызова на дуэль в раунде
#define KILL // убивать ли игрока, когда он не ответил на вызов дуэли

#if defined RANDOM_START_HP
#define MIN_HP 1 // минимальное здоровье у дуэлянтов (не менее 1)
#define MAX_HP 100 // максимальное здоровье у дуэлянтов
#define HEALTHONDUEL random_num(MIN_HP, MAX_HP)
#else
#define HEALTHONDUEL 35 // Сколько HP ставить игрокам на время дуели при отключенном случайном здоровье
#endif

#if defined SOUND
#define MENU_SOUND_VOTE "xxx/vote.wav" // путь к звуку появления меню с ответом на вызов (проигрывается только тому, кого вызвали на дуэль)
#define MENU_SOUND_YES "xxx/yes.wav" // путь к звуку согласия на дуэль (проигрывается всем на сервере)
#define MENU_SOUND_NO "xxx/no.wav" // путь к звуку отказа от дуэли (проигрывается всем на сервере)
#endif

#if defined LIMIT
#define PLAYER_LIMIT 1 // сколько раз за раунд можно вызвать на дуэль каждому из оставшихся игроков
new g_Counter[33];
#endif

/* Окончание настроек */

#if defined KILL
new g_Timer[33];
const TASK_TIMER_DUEL = 200;
#endif
new nameId[32], nameOpp[32], sMenu[512];

enum _:TEAMS { TT, CT }

new HookChain:HookChain_CBasePlayer_PreThink, HookChain:HookChain_SV_StartSound;
new Float:g_fKnifePos[TEAMS][3];
new g_iInsider, g_iOpponent;
new Float:g_fHitWall[33];
new g_iHitWall[33];

const TASK_VOTE_DUEL = 100;

public plugin_init()
{
register_plugin("Knife Duel with Teleport", "1.2", "neygomon"); // thanks Mistrick for code by Search Spawns

HookChain_SV_StartSound = RegisterHookChain(RH_SV_StartSound, "SV_StartSound_Post", true);
DisableHookChain((HookChain_CBasePlayer_PreThink = RegisterHookChain(RG_CBasePlayer_PreThink, "CBasePlayer_PreThink_Post", true)));
RegisterHookChain(RG_CBasePlayer_Killed, "CBasePlayer_Killed_Post", true);
RegisterHookChain(RG_CSGameRules_CheckMapConditions, "CheckMapConditions_Post", true);
FindSpawnsForDuel();

#if defined LIMIT || defined KILL
RegisterHookChain(RG_RoundEnd, "on_round_end_post", .post = true);
#endif

register_menucmd(register_menuid("VoteToDuel"), MENU_KEY_1|MENU_KEY_2, "VoteHandler");
}

#if defined SOUND
public plugin_precache() {
precache_sound(MENU_SOUND_VOTE);
precache_sound(MENU_SOUND_YES);
precache_sound(MENU_SOUND_NO);
}
#endif

public client_disconnected(id) {
if(id == g_iInsider || id == g_iOpponent)
DuelDidNotTake();
}

public CheckMapConditions_Post() {
if(g_iInsider)
DuelDidNotTake();
}

public SV_StartSound_Post(const recipients, const entity, const channel, const sample[], const volume, Float:attenuation, const fFlags, const pitch) {
if(sample[0] == 'w' && sample[7] == '/' && sample[8] == 'k' && sample[13] == '_' && sample[17] == 'w') // вангую говно в error логах
{
new Float:fGameTime = get_gametime();
if(fGameTime - g_fHitWall[entity] > 1.0)
g_iHitWall[entity] = 0;
else
{
new ent1, ent2;
if(++g_iHitWall[entity] == HITWALL - 1 && IsValidPlayersNum(ent1, ent2) && !g_iOpponent)
{

VoteToTheDuel(entity, TeamName:get_member(entity, m_iTeam) == TEAM_TERRORIST ? ent2 : ent1);
DisableHookChain(HookChain_SV_StartSound);
}
}
g_fHitWall[entity] = fGameTime;
}
}

public CBasePlayer_PreThink_Post(id) {
if(g_iInsider == id || g_iOpponent == id)
{
if(is_user_alive(id))
{
if(get_member(get_member(id, m_pActiveItem), m_iId) != WEAPON_KNIFE)
engclient_cmd(id, "weapon_knife");
}
}
}

public CBasePlayer_Killed_Post(const victim, const killer) {
if(g_iInsider)
{
if(task_exists(TASK_VOTE_DUEL))
DuelDidNotTake();
else if(g_iOpponent)
{
if(victim == g_iInsider || victim == g_iOpponent)
DuelDidNotTake();
}
return;
}
#if defined ANNOUNCE
new ent1, ent2;
if(IsValidPlayersNum(ent1, ent2))
{
client_print_color(ent1, print_team_default, "^1[^4DUEL^1] ^3Для вызова на дуэль чиркните ^4%d ^3раза по стене", HITWALL);
client_print_color(ent2, print_team_default, "^1[^4DUEL^1] ^3Для вызова на дуэль чиркните ^4%d ^3раза по стене", HITWALL);
}
#endif
}

VoteToTheDuel(id, opponent)
{
#if defined LIMIT
if(g_Counter[id] != PLAYER_LIMIT) {
#endif
get_user_name(id, nameId, charsmax(nameId));
get_user_name(opponent, nameOpp, charsmax(nameOpp));

#if defined KILL
g_Timer[opponent] = VOTETODUEL + 1;
set_task(1.0, "Kill_Timer", opponent + TASK_TIMER_DUEL, _ , _, "a", VOTETODUEL + 1);
#if defined SOUND
client_cmd(opponent,"spk ^"%s^"", MENU_SOUND_VOTE);
#endif
#else
formatex(sMenu, charsmax(sMenu),
"\r[ \wDUEL \r] \w%s\y, Вас вызвал на дуэль \r%s^n\wВы согласны с ним сыграть?^n^n\r1. \wДа, готов^n\r2. \wНет, боюсь",
nameOpp, nameId);
show_menu(opponent, MENU_KEY_1|MENU_KEY_2, sMenu, VOTETODUEL, "VoteToDuel");
set_task(float(VOTETODUEL), "DuelDidNotTake", TASK_VOTE_DUEL);
#if defined SOUND
client_cmd(opponent,"spk ^"%s^"", MENU_SOUND_VOTE);
#endif
#endif
g_iInsider = id;

#if defined LIMIT
} else {
client_print_color(id, print_team_default, "^1[^4DUEL^1] ^3В этом раунде уже нельзя вызвать на дуэль");
}
#endif

return PLUGIN_HANDLED;
}

#if defined KILL
public Kill_Timer(id) {
id -= TASK_TIMER_DUEL;

if(!is_user_alive(id)) {
remove_task(TASK_TIMER_DUEL + id);
show_menu(id, 0, "^n");
DuelDidNotTake();
return PLUGIN_HANDLED;
}

g_Timer[id]--;
if(g_Timer[id] > 1) {
formatex(sMenu, charsmax(sMenu),
"\r[ \wDUEL \r] \w%s\y, Вас вызвал на дуэль \r%s^n\wОсталось: \r%d \wсек. для ответа^n\wВы согласны с ним сыграть?^n^n\r1. \wДа, готов^n\r2. \wНет, боюсь",
nameOpp, nameId, g_Timer[id]);
show_menu(id, MENU_KEY_1|MENU_KEY_2, sMenu, VOTETODUEL, "VoteToDuel");
} else {
user_kill(id,1);
client_print_color(id, print_team_default, "^1[^4DUEL^1] ^3Необходимо было ответить на вызов сыграть дуэль");
}

return PLUGIN_HANDLED;
}
#endif

public VoteHandler(id, key)
{
switch(key)
{
case 0:
{
g_iOpponent = id;
#if defined KILL
remove_task(TASK_TIMER_DUEL + id);
#else
remove_task(TASK_VOTE_DUEL);
#endif
GoToDuel();
}
case 1:
{
new name[32];
get_user_name(id, name, charsmax(name));
client_print_color(0, print_team_default, "^1[^4DUEL^1] ^3Игрок ^4%s ^3ссыканул и отказался от дуэли", name);
#if defined SOUND
client_cmd(0,"spk ^"%s^"", MENU_SOUND_NO);
#endif
#if defined KILL
remove_task(TASK_TIMER_DUEL + id);
#endif
#if defined LIMIT
g_Counter[g_iInsider]++
#endif
DuelDidNotTake();
}
}
return PLUGIN_HANDLED;
}

#if defined LIMIT || defined KILL
public on_round_end_post() {
#if defined LIMIT
for (new i = 1; i <= MAX_CLIENTS; i++) {
g_Counter[i] = 0;
}
#endif
#if defined KILL
remove_task(TASK_TIMER_DUEL);
#endif
DuelDidNotTake();
}
#endif

public DuelDidNotTake()
{
DisableHookChain(HookChain_CBasePlayer_PreThink);
EnableHookChain(HookChain_SV_StartSound);
remove_task(TASK_VOTE_DUEL);

g_iInsider = 0;
g_iOpponent = 0;
}

// Idea by Mistrick
// Thanks ^_^
FindSpawnsForDuel()
{
new ent = rg_find_ent_by_class(-1, "info_player_start");
get_entvar(ent, var_origin, g_fKnifePos[TT]);

new ent2 = ent, bool:bFindPlace;
new Float:distance = 1000.0;

while(distance > 100.0 && !bFindPlace)
{
while((ent2 = rg_find_ent_by_class(ent2, "info_player_start")))
{
get_entvar(ent2, var_origin, g_fKnifePos[CT]);
if(get_distance_f(g_fKnifePos[TT], g_fKnifePos[CT]) > distance)
{
bFindPlace = true;
break;
}
}
distance -= 100.0;
ent2 = ent;
}
if(!bFindPlace)
set_fail_state("spawns for duel not found :( govnomap...");
}

GoToDuel()
{
if(is_user_alive(g_iInsider) && is_user_alive(g_iOpponent))
{
set_entvar(g_iInsider, var_origin, g_fKnifePos[0]);
set_entvar(g_iOpponent, var_origin, g_fKnifePos[1]);
#if defined SETAIMONOPP
entity_set_aim(g_iInsider, g_iOpponent);
entity_set_aim(g_iOpponent, g_iInsider);
#endif
set_entvar(g_iInsider, var_health, float(HEALTHONDUEL));
set_entvar(g_iOpponent, var_health, float(HEALTHONDUEL));
EnableHookChain(HookChain_CBasePlayer_PreThink);

set_hudmessage(255, 100, 0, -1.0, 0.3, 0, 6.0, 1.0, 0.1, 0.5, -1);
show_hudmessage(0, "Дуэль началась");
#if defined SOUND
client_cmd(0,"spk ^"%s^"", MENU_SOUND_YES);
#endif
}
}

stock IsValidPlayersNum(&idT = 0, &idCT = 0)
{
new pl[32], tt, ct;
get_players(pl, tt, "ae", "TERRORIST");
idT = pl[0];
get_players(pl, ct, "ae", "CT");
idCT = pl[0];
return (tt == 1 && ct == 1);
}

stock entity_set_aim(id, ent)
{
new Float:vOrigin[3], Float:vEntOrigin[3];
get_entvar(id, var_origin, vOrigin);
get_entvar(ent, var_origin, vEntOrigin);

vOrigin[0] -= vEntOrigin[0];
vOrigin[1] -= vEntOrigin[1];
vOrigin[2] -= vEntOrigin[2];

new Float:vNewAngles[3], Float:vAimVector[3], Float:v_length;
v_length = vector_length(vOrigin);

vAimVector[0] = vOrigin[0] / v_length;
vAimVector[1] = vOrigin[1] / v_length;
vAimVector[2] = vOrigin[2] / v_length;

vector_to_angle(vAimVector, vNewAngles);

vNewAngles[0] *= -1;
vNewAngles[1] += 180;

set_entvar(id, var_angles, vNewAngles);
set_entvar(id, var_fixangle, 1);
}
Всем привет!
Взял плагин дуэлей на ножах и решил дополнить своими идеями.
Вроде бы все работает как и задумал, но вот лимит вызова на дуэль работает неправильно.
Должно:
- каждый игрок может вызвать оппонента N раз (выставляется в настройке) за раунд на дуэль. В случае отказа оппонентом вызова, кто уже чиркал ножом по стене, не сможет вызвать в этом раунде более раз, чем указано в настройке. Оппонент же свои разы вызова не тратил и, в случае, если передумал и захотел сыграть дуэль, тогда он сможет вызывать, чиркая о стену.
Получилось на данный момент:
- выставлено 1 вызов за раунд. Игрок 1 вызывает Игрока 2, при этом Игрок 2 отказывается играть и Игрок 1 уже не может вызывать на дуэль. Если Игрок 1 больше не чиркает для вызова по стене, то Игрок 2 может использовать свой раз для вызова Игрока 2. Но если Игрок 1 снова в этом же раунде начнет вызывать на дуэль, то Игрок 2 теряет свой раз для вызова.
Сейчас работает по принципу - вызывает любой игрок только столько раз, сколько указано в настройке, а я хочу, чтобы каждый игрок имел N раз для вызова оппонента.
====
Код брал с других плагинов и справочников, сам незрячий, поэтому, ребята, не ругайте за визуальный вид кода.
 
Сообщения
2,723
Реакции
2,997
Помог
60 раз(а)
MIRDOBRO777, На оригинальном плагине всё работало нормально?
 
Сообщения
112
Реакции
26
wopox1337, в оригинальном плагине нет функций: лимит вызова на дуэль, случайное здоровье и убийство за не ответ на вызов. Я дописывал сам. На данный момент переделал код под общий счетчик, то есть вызывать может сейчас только кто-то один за раунд. Даже, если выставить 5 раз для вызова, то их хоть все может использовать один игрок. А я хочу сделать каждому игроку по N раз вызывать за раунд.
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу