SA-MP Forums Archive
Скриптинг курилка - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: Non-English (https://sampforum.blast.hk/forumdisplay.php?fid=9)
+--- Forum: Languages (https://sampforum.blast.hk/forumdisplay.php?fid=33)
+---- Forum: Русский/Russian (https://sampforum.blast.hk/forumdisplay.php?fid=32)
+---- Thread: Скриптинг курилка (/showthread.php?tid=111279)



Re: Скриптинг курилка - ZiGGi - 02.04.2016

Quote:
Originally Posted by koovaley
View Post
Избитая тема... Проблема со спавном.

Суть проблемы в том, что после первой смерти игрока кидает на class selection, хотя SetSpawnInfo вызывается при каждой смерти (в OnPlayerDeath). Выбор класса не предусмотрен игровым режимом (RolePlay).
Сделал костыль, который спаунит игрока (SpawnPlayer), если его кинуло на выбор класса. Но тогда на месте предыдущей смерти появляются бутылка или сигарета (как в багнутом спауне). Как сделать, чтобы игрока не кидало на выбор класса? Или хотя бы чтоб не было всяких баганых бутылок или сигарет...

На популярных RP-серверах ведь это как-то исправлено. Ни разу еще не видел там, чтоб сервер заставлял игрока выбрать класс, либо появление бутылок или сигарет от данного бага... Может у кого-то есть решение данной проблемы?
Quote:
Originally Posted by S4D
View Post
Настолько избитая, что http://forum.sa-mp.com/showpost.php?...1&postcount=33
AddPlayerClass в коде используется?
Его решение не исправляет проблему. Это должно помочь:
PHP Code:
public OnPlayerRequestClass(playeridclassid)
{
    new
        
Float:x,
        
Float:y,
        
Float:z;
    
GetPlayerPos(playeridxyz);
    
RemoveBuildingForPlayer(playerid1484xyz10.0);
    
RemoveBuildingForPlayer(playerid1485xyz10.0);
    
RemoveBuildingForPlayer(playerid1486xyz10.0);
    return 
1;




Re: Скриптинг курилка - koovaley - 02.04.2016

Quote:
Originally Posted by S4D
View Post
Настолько избитая, что http://forum.sa-mp.com/showpost.php?...1&postcount=33
AddPlayerClass в коде используется?
Quote:
Originally Posted by ZiGGi
View Post
Его решение не исправляет проблему. Это должно помочь:
PHP Code:
public OnPlayerRequestClass(playeridclassid)
{
    new
        
Float:x,
        
Float:y,
        
Float:z;
    
GetPlayerPos(playeridxyz);
    
RemoveBuildingForPlayer(playerid1484xyz10.0);
    
RemoveBuildingForPlayer(playerid1485xyz10.0);
    
RemoveBuildingForPlayer(playerid1486xyz10.0);
    return 
1;

S4D, AddPlayerClass используется в OnGameModeInit.
ZiGGi, что ж, спасибо, предметы теперь исчезают, даже удалось увидеть дымок от только что удаленной сигареты...

Но можно ли как-то "отключить" class selection, чтобы игрока не кидало на него вообще? Опять же, есть игровые режимы, на которых отсутствует выбор класса и игрока после смерти туда не кидает... Интересно, может Kalcor продает крупным проектам секретную супер-функцию, которая отключает class selection


Re: Скриптинг курилка - DartfoL - 02.04.2016

Quote:

Интересно, может Kalcor продает крупным проектам секретную супер-функцию, которая отключает class selection

на самп-рп и арп class selection не отключен, при логине/регистрации эти стрелочки есть


Re: Скриптинг курилка - koovaley - 02.04.2016

Quote:
Originally Posted by DartfoL
View Post
на самп-рп и арп class selection не отключен, при логине/регистрации эти стрелочки есть
Однако после первой смерти и даже после F4 там спаунит нормально, нет никаких бутылок, стрелок и спауна на Grove Street.


Re: Скриптинг курилка - DartfoL - 02.04.2016

Quote:
Originally Posted by koovaley
View Post
Однако после первой смерти и даже после F4 там спаунит нормально, нет никаких бутылок, стрелок и спауна на Grove Street.
В OnPlayerRequestClass нужно добавить SpawnPlayer(playerid)


Re: Скриптинг курилка - Mcc - 02.04.2016

Quote:
Originally Posted by koovaley
View Post
Однако после первой смерти и даже после F4 там спаунит нормально, нет никаких бутылок, стрелок и спауна на Grove Street.
Читайте документацию.

Quote:

Returning 0 in this callback will prevent the player from spawning. The player can be forced to spawn when SpawnPlayer is used, however the player will re-enter class selection the next time they die.




Re: Скриптинг курилка - ZiGGi - 02.04.2016

Quote:
Originally Posted by koovaley
View Post
S4D, AddPlayerClass используется в OnGameModeInit.
ZiGGi, что ж, спасибо, предметы теперь исчезают, даже удалось увидеть дымок от только что удаленной сигареты...

Но можно ли как-то "отключить" class selection, чтобы игрока не кидало на него вообще? Опять же, есть игровые режимы, на которых отсутствует выбор класса и игрока после смерти туда не кидает... Интересно, может Kalcor продает крупным проектам секретную супер-функцию, которая отключает class selection
Вот более-менее стабильный вариант решения этой проблемы:
PHP Code:
#include <a_samp>
static
    
bool:gIsPlayerAuthorized[MAX_PLAYERS char];
main()
{
}
public 
OnPlayerRequestSpawn(playerid)
{
    if (
IsPlayerAuthorized(playerid)) {
        return 
1;
    }
    return 
0;
}
public 
OnPlayerCommandText(playeridcmdtext[])
{
    if (
strcmp("/kill"cmdtexttrue) == 0) {
        
SetPlayerHealth(playerid0.0);
        return 
1;
    }
    
    if (
strcmp("/login"cmdtexttrue) == 0) {
        
SetPlayerAuthorizedStatus(playeridfalse);
        
TogglePlayerSpectating(playerid0);
        return 
1;
    }
    
    if (
strcmp("/spawn"cmdtexttrue) == 0) {
        
SpawnPlayer(playerid);
        return 
1;
    }
    return 
0;
}
public 
OnPlayerRequestClass(playeridclassid)
{
    new
        
Float:x,
        
Float:y,
        
Float:z;
    
GetPlayerPos(playeridxyz);
    
    
RemoveBuildingForPlayer(playerid1484xyz10.0);
    
RemoveBuildingForPlayer(playerid1485xyz10.0);
    
RemoveBuildingForPlayer(playerid1486xyz10.0);
    
SetSpawnInfo(playerid01242499.8, -2129.600123.592.01013899999934999999);
    if (
IsPlayerAuthorized(playerid)) {
        
SpawnPlayer(playerid);
    } else {
        
TogglePlayerSpectating(playerid1);
        
SetTimerEx("SetClassCameraPos"2000"i"playerid);
    }
    return 
1;
}
forward SetClassCameraPos(playerid);
public 
SetClassCameraPos(playerid)
{
    
SetPlayerCameraPos(playerid1879.984252, -2908.6101071.996365);
    
SetPlayerCameraLookAt(playerid1879.666870, -2913.4873040.941269);
}
stock IsPlayerAuthorized(playerid)
{
    return 
_:gIsPlayerAuthorized{playerid};
}
stock SetPlayerAuthorizedStatus(playeridbool:status)
{
    
gIsPlayerAuthorized{playerid} = status;




Re: Скриптинг курилка - koovaley - 02.04.2016

Всем большое спасибо за ответы, особенно ZiGGi за решение проблемы с посторонними объектами


Re: Скриптинг курилка - Diman777 - 02.04.2016

PHP Code:
stock IsPlayerAuthorized(playerid

    return 
_:gIsPlayerAuthorized{playerid}; 

Интересное использование.
Получается функцию не надо объвлять как bool, сразу напечатал перед переменной _: и ф-ия понимает, что должна вернуть, так ведь?
Ты вообще используешь такой вариант?)


Re: Скриптинг курилка - ZiGGi - 02.04.2016

Quote:
Originally Posted by Diman777
View Post
PHP Code:
stock IsPlayerAuthorized(playerid

    return 
_:gIsPlayerAuthorized{playerid}; 

Интересное использование.
Получается функцию не надо объвлять как bool, сразу напечатал перед переменной _: и ф-ия понимает, что должна вернуть, так ведь?
Ты вообще используешь такой вариант?)
Тут нет ничего сверхъестественного, обычное использование тегов в Pawn.
Да, иногда использую.


Re: Скриптинг курилка - Mcc - 02.04.2016

Quote:
Originally Posted by Kolstin
Посмотреть сообщение
Ребят, никто ничего не знает по этому багу?
Особенность движка игры либо клиента, но точно не сервера. В 2010, на моем сервере вызывался рестартом через gmx. После смерти, те игроки которые присутствовали в момент рестарта, первый раз умирали таким образом. Точно не помню. Может путаю что то. Примерно было так.


Re: Скриптинг курилка - Romz - 02.04.2016

Quote:
Originally Posted by Mcc
Посмотреть сообщение
Особенность движка игры либо клиента, но точно не сервера. В 2010, на моем сервере вызывался рестартом через gmx. После смерти, те игроки которые присутствовали в момент рестарта, первый раз умирали таким образом. Точно не помню. Может путаю что то. Примерно было так.
Да понятно что не сервера. Просто может есть костыль какой то для исправления этого бага? Я пытался повторно убить игрока но он не умирает. Ставил 0 хп и меньше нуля, никаких изменений.


Re: Скриптинг курилка - Mcc - 03.04.2016

Quote:
Originally Posted by Kolstin
Посмотреть сообщение
Да понятно что не сервера. Просто может есть костыль какой то для исправления этого бага? Я пытался повторно убить игрока но он не умирает. Ставил 0 хп и меньше нуля, никаких изменений.
Не делать рестарты через gmx или кикать всех игроков перед рестартом, для перезахода на сервер. Не заморачивался этим вопросом, всегда перезагружал сервер через панель.


Re: Скриптинг курилка - Romz - 03.04.2016

Quote:
Originally Posted by Mcc
Посмотреть сообщение
Не делать рестарты через gmx или кикать всех игроков перед рестартом, для перезахода на сервер. Не заморачивался этим вопросом, всегда перезагружал сервер через панель.
В том то и дело что рестарты через gmx не делаю.


Re: Скриптинг курилка - AtomD - 03.04.2016

Происходят странности какие-то с компилятором.

Первое.
В моде есть макрос, с помощью которого вызывается printf() в нужном виде (чтобы не повторять много одинакового текста).
Код:
#define sample(%0)  printf(" ... ... " #%0 " ... ...")
Если использовать в четырех местах в коде, то все нормально. Когда использую пятый раз - компилятор просто зависает (не вылетает) и вес amx равняется нулю. Код в разных файлах располагается. И используется это в перехватываемых колбэках через y_hooks, то есть:
Код:
Hook:sample_OnGameModeInit()
{
  sample("blablabla");
}
Второе.
Есть функция, в ней есть switch с 15 case'ами. В первых четырнадцати создается строка с одинаковым названием (с разными размерами). Если в 15 создать такую же, то выдается ошибка №21. Если не создавать, а просто проделать что нужно с этой строкой, то во время вызова этой функции сервер падает (crashdetect при этом ничего особо не показывает интересного).

У кого какие догадки есть на этот счет?

Список инклудов прикладываю:
Код:
#include <a_samp>
#include <a_mysql>
#include <easyDialog>
#include <Vectoral>
#include <zcmd>
#include <sscanf2>
#include <YSI\y_hooks>
#include <YSI\y_timers>
#include <YSI\y_xml>
Заранее спасибо.


Re: Скриптинг курилка - eakwarp - 03.04.2016

Вы бы код выложили, и с sample, и с кейсами.
В первом подозреваю переполнение стека.


Re: Скриптинг курилка - AtomD - 03.04.2016

Quote:
Originally Posted by eakwarp
Посмотреть сообщение
Вы бы код выложили, и с sample, и с кейсами.
В первом подозреваю переполнение стека.
С sample приложил. Везде точно так же используется, за исключением того, что после этого идут еще некоторые действия (которые спокойно выполняются при успешной компиляции (если убрать sample)).

Подобие с кейсами залил на pastebin: http://pastebin.com/tAcR0f1J
Компилятор выдает ошибку в строке №184.
В строках №163 и №169 объявлены тексты, так как текст должен меняться в зависимости от значений определенных данных игрока.


Re: Скриптинг курилка - OKStyle - 03.04.2016

А почему бы до case не создать string с максимальным размером из всех, а в опциях использовать format(string, нужный_размер, ...) ? Да и вообще можно sizeof, ведь переменная всё равно максимальная создастся.


Re: Скриптинг курилка - eakwarp - 03.04.2016

Что же у всех такая идиотская параноя по их говнокоду, я не буду выкладывать свой код, игожектонибудьувидет, онвсемтакнужен, вот вам подобие из которого я все потенциально проблемное удалил, вместо трех строк в которых ошибка, разбирайтесь. Поймите, нам похер, у нас своего кода достаточно, только проблему в подобном мы вам не поможем найти. А так, соглашусь с OKStyle, создайте стринг выше с максимальным нужным размером.


Re: Скриптинг курилка - AtomD - 03.04.2016

Quote:
Originally Posted by OKStyle
Посмотреть сообщение
А почему бы до case не создать string с максимальным размером из всех, а в опциях использовать format(string, нужный_размер, ...) ? Да и вообще можно sizeof, ведь переменная всё равно максимальная создастся.
Вчера думал так сделать, но руки не дошли и в итоге забыл. Спасибо. Так работает. Но первая проблема все еще актуальна.