Hello, I have slightly modified the plugin fight with knives , but unfortunately he crash the server when both players agree to Fight server crashes ... can u help me fix this ?
public Plugin:myinfo =
{
name = "Knife Fight",
author = "XARiUS, Otstrel.Ru Team",
description = "Let the last two players alive choose whether to knife it out.",
version = KNIFEFIGHT_VERSION,
url = "http://www.the-otc.com/, http://otstrel.ru"
};
new Handle:g_SoundOpenMenu;
new String:sSoundOpenMenu[MAX_FILE_LEN];
new Handle:g_OpenMenuPlaySoundAlive;
new bool:bOpenMenuPlaySoundAlive;
new Handle:g_WinnerSkin_CT, Handle:g_WinnerSkin_TR;
new String:sWinnerSkin_CT[PLATFORM_MAX_PATH], String:sWinnerSkin_TR[PLATFORM_MAX_PATH];
new Handle:g_PathDownloadsModels;
new String:sPathDownloadsModels[PLATFORM_MAX_PATH];
new Handle:g_TimerDressSkin;
new Float:fTimerDressSkin;
new Handle:g_HealthWhenFight;
new iHealthWhenFight;
new Handle:g_CancelArmo;
new bool:bCancelArmo;
new Handle:g_DamageElectro;
new iDamageElectro;
new bool:bKnifeFight = false;
new rnd = 0;
new Float:teleloc[3];
new Float:g_winnerspeed;
new String:language[4];
new String:languagecode[4];
new String:ctname[MAX_NAME_LENGTH];
new String:tname[MAX_NAME_LENGTH];
new String:ctitems[8][64];
new String:titems[8][64];
new String:winnername[MAX_NAME_LENGTH];
new String:losername[MAX_NAME_LENGTH];
new String:g_declinesound[MAX_FILE_LEN];
new String:g_beaconsound[MAX_FILE_LEN];
new String:g_fightsongs[256];
new String:fightsong[20][256];
new String:song[256];
new String:itemswon[256];
new bool:g_winnereffects;
new bool:g_losereffects;
new bool:g_forcefight;
new bool:g_enabled;
new bool:g_alltalk;
new bool:g_alltalkenabled = false;
new bool:g_block;
new bool:g_blockenabled = false;
new bool:g_useteleport;
new bool:g_locatorbeam;
new bool:g_stopmusic;
new bool:g_intermission;
new bool:isFighting = false;
new bool:bombplanted = false;
new ctid, tid, winner, loser, alivect, alivet;
new g_winnerid = 0;
new ctagree = -1;
new tagree = -1;
new songsfound = 0;
new timesrepeated;
new g_iMyWeapons, g_iHealth, g_iAccount, g_iSpeed;
new g_beamsprite, g_halosprite, g_lightning, g_locatebeam, g_locatehalo;
new g_countdowntimer, g_winnerhealth, g_winnermoney, g_minplayers;
new g_fighttimer, fighttimer;
new Float:g_beaconragius;
new Handle:g_Cvarenabled = INVALID_HANDLE;
new Handle:g_Cvaralltalk = INVALID_HANDLE;
new Handle:g_Cvarblock = INVALID_HANDLE;
new Handle:g_Cvarminplayers = INVALID_HANDLE;
new Handle:g_Cvardeclinesound = INVALID_HANDLE;
new Handle:g_Cvarbeaconsound = INVALID_HANDLE;
new Handle:g_Cvarfightsongs = INVALID_HANDLE;
new Handle:g_Cvaruseteleport = INVALID_HANDLE;
new Handle:g_Cvarwinnerspeed = INVALID_HANDLE;
new Handle:g_Cvarwinnerhealth = INVALID_HANDLE;
new Handle:g_Cvarwinnermoney = INVALID_HANDLE;
new Handle:g_Cvarwinnereffects = INVALID_HANDLE;
new Handle:g_Cvarlosereffects = INVALID_HANDLE;
new Handle:g_Cvarlocatorbeam = INVALID_HANDLE;
new Handle:g_Cvarstopmusic = INVALID_HANDLE;
new Handle:g_Cvarforcefight = INVALID_HANDLE;
new Handle:g_Cvarcountdowntimer = INVALID_HANDLE;
new Handle:g_Cvarfighttimer = INVALID_HANDLE;
new Handle:g_Cvarbeaconradius = INVALID_HANDLE;
new Handle:g_Cvar_Debug = INVALID_HANDLE;
new bool:g_debug = false;
new UserMsg:g_VGUIMenu;
new Handle:sv_alltalk = INVALID_HANDLE;
new Handle:sm_noblock = INVALID_HANDLE;
new g_WeaponParent;
new Handle:g_Cvar_SoundPrefDefault = INVALID_HANDLE;
new Handle:g_Cookie_SoundPref = INVALID_HANDLE;
new g_soundPrefs[MAXPLAYERS+1];
new Handle:g_Cookie_FightPref = INVALID_HANDLE;
new g_fightPrefs[MAXPLAYERS+1];
new Handle:g_Cvar_IsBotFightAllowed = INVALID_HANDLE;
new bool:g_isBotFightAllowed = false;
new g_showWinner;
new g_removeNewPlayer;
new Handle:g_Cvar_ShowWinner = INVALID_HANDLE;
new Handle:g_Cvar_RemoveNewPlayer = INVALID_HANDLE;
LoadTranslations("knifefight.phrases");
new Handle:Cvar_Version = CreateConVar("sm_knifefight_version", KNIFEFIGHT_VERSION,
"Knife Fight Version.", FCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY|FCVAR_DONTRECORD);
// KLUGE: Update version cvar if plugin updated on map change.
SetConVarString(Cvar_Version, KNIFEFIGHT_VERSION);
g_SoundOpenMenu = CreateConVar("sm_knifefight_soundopenmenu", "knifefight/chicken.wav", "Путь к звуку, вопроизводимый при открытие меню.");
g_WinnerSkin_TR = CreateConVar("sm_knifefight_winner_skin_tr", "", "Путь к модели TR, победителю на ножах.");
g_WinnerSkin_CT = CreateConVar("sm_knifefight_winner_skin_ct", "", "Путь к модели CT, победителю на ножах.");
g_PathDownloadsModels = CreateConVar("sm_knifefight_downloads_models", "cfg/sourcemod/knifefinght_dowloads.txt", "Путь к файлу, от куда будут скачиваться модели");
g_OpenMenuPlaySoundAlive = CreateConVar("sm_knifefight_onlyalive", "1", "Вопсроизводить звук при открытие меню: 1 = Только живым, 0 = Всем", _, true, 0.0, true, 1.0);
g_TimerDressSkin = CreateConVar("sm_knifefight_timer_dress_skin", "0.1", "Время через которое будет одеваться победный скин", _, true, 0.01, true, 0.99);
g_HealthWhenFight = CreateConVar("sm_knifefight_health_fight", "100", "Количество Hp у игроков, когда играют на ножах", _, true, 25.0, true, 350.0);
g_CancelArmo = CreateConVar("sm_knifefight_cancel_armo", "1", "Сбрасывать броню, когда играют на ножах", _, true, 0.0, true, 1.0);
g_DamageElectro = CreateConVar("sm_knifefight_electro_fight", "50", "Сколько наносить урона ножом, чтоб из игрока выбивались молнии. 0 = Disabled", _, true, 0.0);
g_Cvarenabled = CreateConVar("sm_knifefight_enabled", "1",
"Включить плагин");
g_Cvar_Debug = CreateConVar("sm_knifefight_debug", "0",
"Включить отладку");
g_debug = GetConVarBool(g_Cvar_Debug);
g_Cvaralltalk = CreateConVar("sm_knifefight_alltalk", "1",
"Включить alltalk во время ножевого боя");
g_Cvarblock = CreateConVar("sm_knifefight_block", "0",
"Включить блокировку игрока (выключение sm_noblock) если sm_noblock включен во время ножевого боя");
g_Cvarminplayers = CreateConVar("sm_knifefight_minplayers", "2",
"Минимальное количество игроков на сервере для боя на ножах.");
g_Cvaruseteleport = CreateConVar("sm_knifefight_useteleport", "1",
"Использовать встроенную систему телепортации перед боем. Это помогает игрокам найти друг друга быстрее");
g_Cvarforcefight = CreateConVar("sm_knifefight_forcefight", "0",
"Автоматическе будет бой на ножах, меню выбора не будет выводиться.");
g_Cvarwinnerhealth = CreateConVar("sm_knifefight_winnerhealth", "0",
"Количество здоровья за победу в ножевом. 0 = Disabled");
g_Cvarwinnerspeed = CreateConVar("sm_knifefight_winnerspeed", "0",
"Множитель скорости за победу в ножевом. 0 = Disabled (1.0 is normal speed, 2.0 is twice normal)");
g_Cvarwinnermoney = CreateConVar("sm_knifefight_winnermoney", "0",
"Сколько дать денег за победу. 0 = Disabled");
g_Cvarwinnereffects = CreateConVar("sm_knifefight_winnereffects", "1",
"Использовать \"молнию\" и звуковые эффекты на победителе. 0 = Disabled");
g_Cvarlosereffects = CreateConVar("sm_knifefight_losereffects", "1",
"Растворять проигравшего игрока. 0 = Disabled");
g_Cvarlocatorbeam = CreateConVar("sm_knifefight_locatorbeam", "1",
"Использовать лучи локаторы если игроки далеко друг от друга. 0 = Disabled");
g_Cvarstopmusic = CreateConVar("sm_knifefight_stopmusic", "0",
"Остановить музыку если бой закончился. 0 = Disabled");
g_Cvardeclinesound = CreateConVar("sm_knifefight_declinesound", "knifefight/chicken.wav",
"Звуковой файл проигрываемый, когда игрок отказывается от ножевого боя.");
g_Cvarbeaconsound = CreateConVar("sm_knifefight_beaconsound", "buttons/blip1.wav",
"Звук проигрываемый когда на игроках есть маяк показывающий кольца.");
g_Cvarcountdowntimer = CreateConVar("sm_knifefight_countdowntimer", "3",
"Количество секунд отсчитывающееся до поединка на ножах");
g_Cvarfighttimer = CreateConVar("sm_knifefight_fighttimer", "30",
"Длительность ножевого поединка");
g_Cvarbeaconradius = CreateConVar("sm_knifefight_beaconradius", "800",
"Радиус колец маяка.");
g_Cvarfightsongs = CreateConVar("sm_knifefight_fightsongs", "",
"Звуковые файлы проигрываемые во время поединка. (Пример: knifefight/song1.mp3,knifefight/song2.mp3,knifefight/song3.mp3) (max: 20)");
g_Cvar_IsBotFightAllowed = CreateConVar("sm_knifefight_botfight", "1",
"Разрешить ботам сражаться в ножевом поединка. 0 = Disabled");
g_isBotFightAllowed = GetConVarBool(g_Cvar_IsBotFightAllowed);
g_Cvar_ShowWinner = CreateConVar("sm_knifefight_showwinner", "0",
"Показывать победителя: 0 = вверху слева (Top), 1 = в чате.");
g_showWinner = GetConVarInt(g_Cvar_ShowWinner);
g_Cvar_RemoveNewPlayer = CreateConVar("sm_knifefight_removenewplayer", "0",
"Присоединившегося игрока: 0 = убивать, 1 = переместить в наблюдатели, когда битва на ножах уже началась.");
g_removeNewPlayer = GetConVarInt(g_Cvar_RemoveNewPlayer);
SetupOffsets()
{
g_iMyWeapons = FindSendPropOffs("CBaseCombatCharacter", "m_hMyWeapons");
if (g_iMyWeapons == -1)
{
SetFailState("[KnifeFight] Error - Unable to get offset for CBaseCombatCharacter::m_hMyWeapons");
}
g_iHealth = FindSendPropOffs("CCSPlayer", "m_iHealth");
if (g_iHealth == -1)
{
SetFailState("[KnifeFight] Error - Unable to get offset for CSSPlayer::m_iHealth");
}
g_iAccount = FindSendPropOffs("CCSPlayer", "m_iAccount");
if (g_iAccount == -1)
{
SetFailState("[KnifeFight] Error - Unable to get offset for CSSPlayer::m_iAccount");
}
g_iSpeed = FindSendPropOffs("CCSPlayer", "m_flLaggedMovementValue");
if (g_iSpeed == -1)
{
SetFailState("[KnifeFight] Error - Unable to get offset for CSSPlayer::m_flLaggedMovementValue");
}
}
public OnAutoConfigsBuffered()
{
g_intermission = false;
}
public OnSettingChanged(Handle:convar, const String:oldValue[], const String:newValue[])
{
if (convar == g_Cvarenabled) g_enabled = (newValue[0] == '1');
else if (convar == g_Cvaralltalk) g_alltalk = (newValue[0] == '1');
else if (convar == g_Cvarblock) g_block = (newValue[0] == '1');
else if (convar == g_Cvaruseteleport) g_useteleport = (newValue[0] == '1');
else if (convar == g_Cvarwinnereffects) g_winnereffects = (newValue[0] == '1');
else if (convar == g_Cvarlosereffects) g_losereffects = (newValue[0] == '1');
else if (convar == g_Cvarlocatorbeam) g_locatorbeam = (newValue[0] == '1');
else if (convar == g_Cvarstopmusic) g_stopmusic = (newValue[0] == '1');
else if (convar == g_Cvarforcefight) g_forcefight = (newValue[0] == '1');
else if (convar == g_Cvarwinnerhealth) g_winnerhealth = StringToInt(newValue);
else if (convar == g_Cvarwinnerspeed) g_winnerspeed = StringToFloat(newValue);
else if (convar == g_Cvarwinnermoney) g_winnermoney = StringToInt(newValue);
else if (convar == g_Cvarcountdowntimer) g_countdowntimer = StringToInt(newValue);
else if (convar == g_Cvarfighttimer) g_fighttimer = StringToInt(newValue);
else if (convar == g_Cvarbeaconradius) g_beaconragius = StringToFloat(newValue);
else if (convar == g_Cvarminplayers) g_minplayers = StringToInt(newValue);
else if (convar == g_Cvar_Debug) g_debug = (newValue[0] == '1');
else if (convar == g_Cvar_IsBotFightAllowed) g_isBotFightAllowed = (newValue[0] == '1');
else if (convar == g_Cvar_ShowWinner) g_showWinner = GetConVarInt(g_Cvar_ShowWinner);
else if (convar == g_Cvar_RemoveNewPlayer) g_removeNewPlayer = GetConVarInt(g_Cvar_RemoveNewPlayer);
public Action:StartFight()
{
// check if one player left server
if (ctid == 0 || tid == 0)
{
return;
}
// check if there are only two players
alivect = 0, alivet = 0;
for (new i = 1; i <= MaxClients; i++)
{
new team;
if (IsClientInGame(i) && IsPlayerAlive(i))
{
team = GetClientTeam(i);
if (team == 3) { alivect++; }
else if (team == 2) { alivet++; }
}
}
// check if there are only two players and round has
// not ended or bomb is not planted
if (alivect != 1 || alivet != 1 || bombplanted)
{
return;
}
// teleport players
if (g_useteleport)
{
SetEntData(ctid, g_iHealth, 900);
SetEntData(tid, g_iHealth, 900);
new Float:ctvec[3];
new Float:tvec[3];
new Float:distance[1];
GetClientAbsOrigin(ctid,Float:ctvec);
GetClientAbsOrigin(tid,Float:tvec);
distance[0] = GetVectorDistance(ctvec, tvec, true);
if (distance[0] >= 600000.0)
{
teleloc = ctvec;
CreateTimer(0.1, SlapTimer, _, TIMER_REPEAT);
CreateTimer(0.5, TeleportTimer);
}
else if (g_locatorbeam)
{
CreateTimer(0.1, DrawBeamsTimer, _, TIMER_REPEAT);
}
}
else if (g_locatorbeam)
{
CreateTimer(0.1, DrawBeamsTimer, _, TIMER_REPEAT);
}
// display prepare to fight
CreateTimer(1.0, Countdown, _, TIMER_REPEAT);
}
public Action:CancelFight()
{
ctagree = -1;
tagree = -1;
isFighting = false;
Trace("Fight is ended.");
if (g_stopmusic && songsfound > 0)
{
new clients[MaxClients];
new total = 0;
for (new i=1; i<=MaxClients; i++)
{
if (IsClientInGame(i) && g_soundPrefs[i])
{
clients[total++] = i;
}
}
if (total)
{
EmitSound(clients, total, song,
_, SNDCHAN_AUTO, SNDLEVEL_NORMAL, SND_STOPLOOPING, SNDVOL_NORMAL, SNDPITCH_NORMAL);
}
}
if (winner != 0)
{
if (IsPlayerAlive(winner))
{
WeaponHandler(winner, GetClientTeam(winner));
for (new i = 0; i <= 7; i++)
{
ctitems[i] = "";
titems[i] = "";
}
}
}
}
public Action:FightTimer(Handle:timer)
{
if ( !isFighting )
{
return Plugin_Stop;
}
public Action:DrawBeamsTimer(Handle:timer)
{
if ( !isFighting || !IsPlayerAlive(ctid) || !IsPlayerAlive(tid) )
{
return Plugin_Stop;
}
// we are fighting and alive
new Float:ctvec[3];
new Float:tvec[3];
new Float:distance[1];
new color[4] = {255, 75, 75, 255};
GetClientEyePosition(ctid,Float:ctvec);
GetClientEyePosition(tid,Float:tvec);
distance[0] = GetVectorDistance(ctvec, tvec, true);
if ( distance[0] < 200000.0 )
{
return Plugin_Stop;
}
public EventRoundStart(Handle:event, const String:name[],bool:dontBroadcast)
{
if ( !g_enabled )
{
return;
}
if ( g_alltalk && g_alltalkenabled )
{
g_alltalkenabled = false;
SetConVarInt(sv_alltalk, 0);
}
// switch blocking
if ( g_block && g_blockenabled )
{
g_blockenabled = false;
if ( sm_noblock == INVALID_HANDLE )
{
sm_noblock = FindConVar("sm_noblock");
}
if ( sm_noblock != INVALID_HANDLE )
{
SetConVarInt(sm_noblock, 1);
}
}
if (isFighting)
{
// HINT: CancelFight gives weapons to winner!
// We will be here after warmup end.
// Winner is 0, so no extra weapon will be given.
CancelFight();
}
ctname = "";
tname = "";
winnername = "";
losername = "";
alivect = 0;
alivet = 0;
ctid = 0;
tid = 0;
loser = 0;
bombplanted = false;
timesrepeated = g_countdowntimer;
fighttimer = g_fighttimer;
}
public EventBombPlanted(Handle:event, const String:name[],bool:dontBroadcast)
{
if ( g_enabled )
{
bombplanted = true;
}
}
public Action:EventItemPickup(Handle:event, const String:name[],bool:dontBroadcast)
{
if ( !g_enabled || !isFighting )
{
return;
}
new clientid = GetClientOfUserId(GetEventInt(event, "userid"));
if ( clientid == ctid || clientid == tid )
{
new String:item[64];
GetEventString(event, "item", item, sizeof(item));
if ( !StrEqual(item, "knife", false) )
{
FakeClientCommand(clientid, "use weapon_knife");
// HINT: delay is needed to check isFighting
// before weapon remove and also
// to prevent crashes with Gungame4 Turbo
new Handle:pack = CreateDataPack();
WritePackCell(pack, clientid);
WritePackString(pack, item);
CreateTimer(0.1, DelayWeapon, pack);
}
}
}
new tesla = CreateEntityByName("point_tesla"); //Он делается с помощью создания entity объекта "point_tesla"
DispatchKeyValue(tesla, "m_flRadius", "100.0"); // Радиус
DispatchKeyValue(tesla, "beamcount_min", "5"); // Минимальное Количество всплесков
DispatchKeyValue(tesla, "beamcount_max", "10"); //Максимальное
DispatchKeyValue(tesla, "lifetime_min", "0.7"); //Минимальное время жизни
DispatchKeyValue(tesla, "lifetime_max", "1.0"); //Максимальное время жизни
SendKnifeMenu(client)
{
new String:title[128];
new String:question[128];
new String:yes[128];
new String:no[128];
Format(title,127, "%t", "Knife menu title");
Format(question,127, "%t", "Knife question");
Format(yes,127, "%t", "Yes option");
Format(no,127, "%t", "No option");
I know that there are analogues of workers but I need exactly this ... because he's cool ...
I'll be very grateful if you can help me , or at least spend a little of your time .