PDA

Просмотр полной версии : [Вопрос] Не корректная работа системы дуэлей



Carlos Cooper
26.01.2018, 19:14
Взял на доработку скрипт дуэлей. После того как принимающий дуэль нажимает "Принять" ничего не происходит и дуэль не начинается. Не знаю в чем причина.
Код FS ниже:


#include <a_samp>
#include <streamer>
//-----------Дуэль---------------//
new PlayerInDuel[MAX_PLAYERS];
new WeapForDuel=42;
new MoneyForDuel=1000;
new Creator[MAX_PLAYERS];
new bool:Mesto=false;

#define COLOR_RED 0xFF0000AA
#define COLOR_GRAD1 0xB4B5B7FF
#define COLOR_WHITE 0xFFFFFFAA
#define COLOR_LIME 0x10F441AA
#define COLOR_ORANGE 0xFF9900AA
#define COLOR_GREEN 0x33AA33AA

#define DUEL_DIALOG 500
forward DuelStart(playerid);
#if defined FILTERSCRIPT

public OnFilterScriptInit()
{
print("\n--------------------------------------");
print(" Duel.");
print("--------------------------------------\n");
return 1;
}

public OnFilterScriptExit()
{
return 1;
}

#else
#endif

public OnPlayerConnect(playerid)
{
PlayerInDuel[playerid] = 0;
Creator[playerid] = INVALID_PLAYER_ID;
return 1;
}

public OnPlayerSpawn(playerid)
{
if(PlayerInDuel[playerid]==1)
{
PlayerInDuel[playerid]=0;
Mesto=false;
}
return 1;
}

public OnPlayerDeath(playerid, killerid, reason)
{
if(PlayerInDuel[killerid]==1 && PlayerInDuel[playerid]==1)
{
new str[124];
PlayerInDuel[killerid]=0;
PlayerInDuel[playerid]=0;
Creator[killerid] = INVALID_PLAYER_ID;
Creator[playerid] = INVALID_PLAYER_ID;
GivePlayerMoney(killerid,MoneyForDuel);
GivePlayerMoney(playerid,-MoneyForDuel);
format(str,20,"~g~+~w~$~y~%d",MoneyForDuel);
GameTextForPlayer(killerid,str,2000,1);
format(str,20,"~r~-~w~$~y~%d",MoneyForDuel);
GameTextForPlayer(playerid,str,2000,1);
format(str,124,"В дуэли между %s и %s победу одержал-%s.(Ставка: $%d. Оружие: %d)",pNick(killerid),pNick(playerid),pNick(killerid),MoneyForDuel,WeapForDuel);
SendClientMessageToAll(COLOR_ORANGE,str);
Mesto=false;
SetPlayerVirtualWorld(playerid,0);
SetPlayerVirtualWorld(killerid,0);
SpawnPlayer(killerid);
}
return 1;
}

public OnPlayerCommandText(playerid, cmdtext[])
{
new string[180];
new giveplayerid;
new cmd[124],tmp[124],idx;
cmd = strtok(cmdtext, idx);
//-----------------------------------
if(strcmp(cmd,"/duel",true)==0)
{
if(PlayerInDuel[playerid]==1) return SendClientMessage(playerid,COLOR_GRAD1,"Вы уже на дуэли!");
tmp = strtok(cmdtext, idx);
if(!strlen(tmp)) return SendClientMessage(playerid,COLOR_GRAD1,"Используйте: /duel [ID игрока] [ID оружия] [Ставка]");
giveplayerid=strval(tmp);
tmp = strtok(cmdtext, idx);
if(!strlen(tmp)) return SendClientMessage(playerid,COLOR_GRAD1,"Используйте: /duel [ID игрока] [ID оружия] [Ставка]");
WeapForDuel=strval(tmp);
if(WeapForDuel<0 || WeapForDuel>42) return SendClientMessage(playerid,COLOR_GRAD1,"Вы ввели неверное ID оружия для дуэли. (От 0 до 42).");
tmp = strtok(cmdtext, idx);
if(!strlen(tmp)) return SendClientMessage(playerid,COLOR_GRAD1,"Используйте: /duel [ID игрока] [ID оружия] [Ставка]");
MoneyForDuel=strval(tmp);
if(MoneyForDuel<1 || MoneyForDuel>100000) return SendClientMessage(playerid,COLOR_GRAD1,"Ставка от $1 до $100.000!");
if(MoneyForDuel>GetPlayerMoney(playerid)) return SendClientMessage(playerid,COLOR_GRAD1,"У вас нет таких денег для ставки!");
if(MoneyForDuel>GetPlayerMoney(giveplayerid)) return SendClientMessage(playerid,COLOR_GRAD1,"У вашего оппонента нет таких денег!");
if(!IsPlayerConnected(giveplayerid)) return SendClientMessage(playerid,COLOR_GRAD1,"Такого игрока нет на сервере!");
if(giveplayerid != INVALID_PLAYER_ID)
{
if(playerid==giveplayerid) return SendClientMessage(playerid,COLOR_GRAD1,"Вы не можете вызывать на дуэль самого себя!");
if(PlayerInDuel[giveplayerid]==1) return SendClientMessage(playerid,COLOR_GRAD1,"Этот игрок уже на дуэли!");
Creator[giveplayerid]=playerid;
if(Mesto==true) return SendClientMessage(playerid,COLOR_GRAD1,"Места в дуэли заняты!");
format(string,sizeof(string),"Вы пригласили игрока %s на дуэль!",pNick(giveplayerid));
SendClientMessage(playerid,COLOR_GREEN,string);
new invite[100];
format(invite,100,"Игрок %s вызывает вас на дуэль!\n\
ID оружия: %d.\n\
Ставка: $%d.\n",pNick(playerid),WeapForDuel,MoneyForDuel);
ShowPlayerDialog(giveplayerid,DUEL_DIALOG,DIALOG_STYLE_MSGBOX,"Вызов на дуэль",invite,"Принять","Нет");
return 1;
}
}
return 0;
}

public DuelStart(playerid)
{
new string[128];
for(new i=0; i<MAX_PLAYERS; i++)
{
if(PlayerInDuel[i]==1)
{
TogglePlayerControllable(i, true);
format(string,128,"Duel started! Go,Go!");
GameTextForPlayer(i,string,2500,3);
}
}
return 1;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
new duelid=Creator[playerid];
if(dialogid==DUEL_DIALOG)
{
if(response)
{
for(new i=0; i<MAX_PLAYERS; i++)
{
PlayerInDuel[i]=1;
SetPlayerHealth(i,100);
SetCameraBehindPlayer(i);
SetPlayerVirtualWorld(i,2);
TogglePlayerControllable(i, false);
ResetPlayerWeapons(i);
GivePlayerWeapon(i, WeapForDuel, 99999);
SendClientMessage(i,COLOR_LIME,"Через 5 секунд стартует дуэль.Приготовтесь!");
}
SetPlayerPos(playerid,314.4800000,35.0200000,1001.4700000);
SetPlayerPos(duelid,336.3500000,34.8200000,1001.4700000);
Mesto=true;
SetTimer("DuelStart",5000,0);
Creator[playerid] = INVALID_PLAYER_ID;
}
else
{
new string[150];
format(string, sizeof(string), "Ты отказался на участии в дуэли против %s!", pNick(duelid));
SendClientMessage(playerid, -1, string);
format(string, sizeof(string), "%s отказался на участие в дуэли против вас!", pNick(playerid));
SendClientMessage(Creator[playerid], -1, string);
Creator[playerid] = INVALID_PLAYER_ID;
}
}
return 1;
}

public OnPlayerClickPlayer(playerid, clickedplayerid, source)
{
return 1;
}
stock pNick(playerid)
{
new nick[MAX_PLAYER_NAME];
GetPlayerName(playerid, nick, MAX_PLAYER_NAME);
return nick;
}
strtok(const string3[], &index)
{
new length = strlen(string3);
while ((index < length) && (string3[index] <= ' '))
{
index++;
}

new offset = index;
new result[20];
while ((index < length) && (string3[index] > ' ') && ((index - offset) < (sizeof(result) - 1)))
{
result[index - offset] = string3[index];
index++;
}
result[index - offset] = EOS;
return result;
}

Long-
27.01.2018, 13:16
Возможно выход за пределы массива, краш детект подключен? И что в логах?
А лучше перенеси этот FS в мод.