Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 2 из 2
  1. #1
    Аватар для Carlos Cooper
    Пользователь

    Статус
    Оффлайн
    Регистрация
    18.01.2018
    Сообщений
    5
    Репутация:
    0 ±

    Не корректная работа системы дуэлей

    Взял на доработку скрипт дуэлей. После того как принимающий дуэль нажимает "Принять" ничего не происходит и дуэль не начинается. Не знаю в чем причина.
    Код FS ниже:
      Открыть/закрыть

    Код HTML:
    #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;
    }

  2. #2
    Аватар для Long-
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.11.2016
    Сообщений
    131
    Репутация:
    23 ±
    Возможно выход за пределы массива, краш детект подключен? И что в логах?
    А лучше перенеси этот FS в мод.

 

 

Информация о теме

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

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •