PDA

Просмотр полной версии : [Вопрос] По поводу смерти игрока.



nikvlad
26.07.2016, 11:03
Всем привет, наткнулся на проблемку: когда я умираю первый раз, меня спавнит на рандомных координатах в скине CJ.http://i.imgur.com/kSXkOgj.jpg Появляются кнопки: <, >, SPAWN. Если я умираю второй раз (третий, четвертый и т.д.) меня спавнит там, где надо.http://i.imgur.com/UloiD0a.jpg

OnPlayerDeath:
public OnPlayerDeath(playerid, killerid, reason)
{
return 1;
}
OnPlayerSpawn:
public OnPlayerSpawn(playerid)
{
TogglePlayerSpectating(playerid,0);
if(pData[playerid][pSkin] == 0)
{
if(pData[playerid][pGender] == 1)
{
SetPlayerSkin(playerid, MaleSkins[0]);
}
else
{
SetPlayerSkin(playerid, FemaleSkins[0]);
}
SCM(playerid,COLOR_ORANGE,"Выберите внешность Вашего персонажа!");
TogglePlayerControllable(playerid,0);
SetPlayerVirtualWorld(playerid,playerid+1);
SetPlayerPos(playerid,1575.8920,-1235.2469,151.6970);
SetPlayerFacingAngle(playerid,129.8999);
SetPlayerCameraPos(playerid,1571.8352,-1239.6108,153.0927);
SetPlayerCameraLookAt(playerid,1576.4738,-1234.8547,151.6970);
SelectTextDraw(playerid, 0xFFFFFFFF);
return 1;
}
if(GetPVarInt(playerid, "loggined") == 1)
{
for(new i = 0; i < 7; i++)
{
TextDrawHideForPlayer(playerid,Logo[i]),TextDrawShowForPlayer(playerid,Logo[i]);
}
SetPlayerScore(playerid, pData[playerid][pLevel]);
SetPlayerHealth(playerid, 100.0);
SetPlayerSkin(playerid,pData[playerid][pSkin]);
SetPlayerVirtualWorld(playerid,0);
TogglePlayerControllable(playerid,1);
if(pData[playerid][pLevel] <= 3)
{
new spawnls = random(4);
if(spawnls == 0)
{
SetPlayerPos(playerid,1762.3660,-1893.1317,13.5606);
SetPlayerFacingAngle(playerid,270.7868);
}
if(spawnls == 1)
{
SetPlayerPos(playerid,1154.5562,-1768.4633,16.5938);
SetPlayerFacingAngle(playerid,1.7675);
}
if(spawnls == 2)
{
SetPlayerPos(playerid,1765.0052,-1903.4672,13.5663);
SetPlayerFacingAngle(playerid,270.7868);
}
if(spawnls == 3)
{
SetPlayerPos(playerid,1147.7163,-1768.9059,16.5992);
SetPlayerFacingAngle(playerid,0.7231);
}
}
if(pData[playerid][pLevel] > 3 && pData[playerid][pLevel] <= 8)
{
SetPlayerPos(playerid,-1969.0582,159.8374,27.6875);
SetPlayerFacingAngle(playerid,177.5901);
}
if(pData[playerid][pLevel] >= 9)
{
SetPlayerPos(playerid,2846.0134,1291.2833,11.3906);
SetPlayerFacingAngle(playerid,92.5072);
}
SetCameraBehindPlayer(playerid);
SetPlayerColor(playerid,0xFFFFFF11);
}
return 1;
}

В чем может быть проблема?

Skull
26.07.2016, 17:39
Если это происходит тогда, когда вы умираете в транспорте, то фиксается вот так:


stock __FixedSpawnPlayer(playerid)
{
if (GetPlayerVehicleID(playerid))
{
new Float:x,Float:y,Float:z;
GetVehiclePos(GetPlayerVehicleID(playerid), x, y, z),
SetPlayerPos(playerid, x, y, z);
}
return SpawnPlayer(playerid);
}
#if defined _ALS_SpawnPlayer
#undef SpawnPlayer
#else
#define _ALS_SpawnPlayer
#endif
#define SpawnPlayer __FixedSpawnPlayer

vovandolg
26.07.2016, 18:03
Если это происходит тогда, когда вы умираете в транспорте, то фиксается вот так:


stock __FixedSpawnPlayer(playerid)
{
if (GetPlayerVehicleID(playerid))
{
new Float:x,Float:y,Float:z;
GetVehiclePos(GetPlayerVehicleID(playerid), x, y, z),
SetPlayerPos(playerid, x, y, z);
}
return SpawnPlayer(playerid);
}
#if defined _ALS_SpawnPlayer
#undef SpawnPlayer
#else
#define _ALS_SpawnPlayer
#endif
#define SpawnPlayer __FixedSpawnPlayer


А не проще будет эту парочку GetPlayerVehicleID(playerid) засунуть в переменную и юзать её потом?
_____________________________________
Я так понял сервер RP жанра, тогда вот эта тема (http://pro-pawn.ru/showthread.php?13526-%D0%9E%D0%B1%D1%85%D0%BE%D0%B4-%D1%81%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D0%BD%D0%BE%D0%B3%D0%BE-%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0-%D1%81%D0%BA%D0%B8%D0%BD%D0%B0-%28%D1%81%D0%BA%D1%80%D1%8B%D1%82%D1%8C-%D0%BA%D0%BD%D0%BE%D0%BF%D0%BA%D0%B8-%D0%B8-Spawn-%29) для Вас

Skull
26.07.2016, 18:18
Ну, имхо, лучше напрямую, потому что я использую ее всего-то дважды, использовал бы больше - объявил бы переменную.
Ну, если очень принципиально, то пожалуйста:


stock __FixedSpawnPlayer(playerid)
{
new vehicleid = GetPlayerVehicleID(playerid);
if (vehicleid)
{
new Float:x,Float:y,Float:z;
GetVehiclePos(vehicleid, x, y, z),
SetPlayerPos(playerid, x, y, z);
}
return SpawnPlayer(playerid);
}
#if defined _ALS_SpawnPlayer
#undef SpawnPlayer
#else
#define _ALS_SpawnPlayer
#endif
#define SpawnPlayer __FixedSpawnPlayer

vovandolg
26.07.2016, 18:24
Ну, имхо, лучше напрямую, потому что я использую ее всего-то дважды, использовал бы больше - объявил бы переменную.
Ну, если очень принципиально, то пожалуйста:]

Это не принципиально, это быстродействие на выполнение команды...

Skull
26.07.2016, 18:32
Надеюсь, тебе помогут выигранные тобой микромикромикросекунды :)

nikvlad
26.07.2016, 20:24
Если это происходит тогда, когда вы умираете в транспорте, то фиксается вот так:


stock __FixedSpawnPlayer(playerid)
{
if (GetPlayerVehicleID(playerid))
{
new Float:x,Float:y,Float:z;
GetVehiclePos(GetPlayerVehicleID(playerid), x, y, z),
SetPlayerPos(playerid, x, y, z);
}
return SpawnPlayer(playerid);
}
#if defined _ALS_SpawnPlayer
#undef SpawnPlayer
#else
#define _ALS_SpawnPlayer
#endif
#define SpawnPlayer __FixedSpawnPlayer


Нет, это происходит при любой первой смерти игрока

nikvlad
26.07.2016, 20:57
Первый способ Deimos'a сработал, НО я на пару милисекунд все-таки появлялся в скине CJ. Второй способ не работал вообще, спавнюсь в скине CJ, падаю с нулевых координат. Как фиксить?

vovandolg
27.07.2016, 04:38
НО я на пару милисекунд все-таки появлялся в скине CJ.

Ну так не на всю игру уже)) хоть бы и этим 2 секундам спасибо сказал

DeimoS
27.07.2016, 06:37
AddPlayerClass имеется? Если нет, то попробуй добавить

nikvlad
27.07.2016, 07:52
AddPlayerClass имеется? Если нет, то попробуй добавить

Имеется.


public OnGameModeInit()
{
DisableInteriorEnterExits();
mysql_connects();
mysql_debug(1);
SendRconCommand("language Russian");
SendRconCommand("hostname Loyal Role Play | South Server");
SetGameModeText("v0.1");
#include <new/TextDraws>
#include <new/Skin_Int>
AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
return 1;
}

DeimoS
27.07.2016, 09:55
Покажи полностью OnPlayerConnect, OnPlayerRequestClass, OnPlayerSpawn и OnPlayerDeath.

nikvlad
27.07.2016, 10:39
OnPlayerConnect:

public OnPlayerConnect(playerid)
{
SetToDefault(playerid);
GetPlayerName(playerid,pData[playerid][pNickname],MAX_PLAYER_NAME);
if(!IsRpName(pData[playerid][pNickname]))
{
SPD(playerid, 0, DIALOG_STYLE_MSGBOX, "{FFEF0D}Îøèáêà", "Ó âàñ äîëæåí áûòü ÐÏ íèê. Íàïðèìåð: Vasya_Pupkin, Nikita_Shishkin, Jacob_Jenkins... Èçìåíèòå åãî è ïîâòîðèòå ðåãèñòðàöèþ", "Çàêðûòü", "");
NewKick(playerid);
return 1;
}
TogglePlayerSpectating(playerid,1);
for(new i = 0; i < 7; i++)
{
TextDrawShowForPlayer(playerid,Logo[i]);
}
SetTimerEx("PlayerConnect", 300, false, "i", playerid);
#include <new/removedobjects>
return 1;
}
OnPlayerRequestClass:

public OnPlayerRequestClass(playerid, classid)
{
return 1;
}
OnPlayerSpawn:

public OnPlayerSpawn(playerid)
{
TogglePlayerSpectating(playerid,0);
if(pData[playerid][pSkin] == 0)
{
if(pData[playerid][pGender] == 1)
{
SetPlayerSkin(playerid, MaleSkins[0]);
}
else
{
SetPlayerSkin(playerid, FemaleSkins[0]);
}
SCM(playerid,COLOR_ORANGE,"Âûáåðèòå âíåøíîñòü Âàøåãî ïåðñîíàæà!");
TogglePlayerControllable(playerid,0);
SetPlayerVirtualWorld(playerid,playerid+1);
SetPlayerPos(playerid,1575.8920,-1235.2469,151.6970);
SetPlayerFacingAngle(playerid,129.8999);
SetPlayerCameraPos(playerid,1571.8352,-1239.6108,153.0927);
SetPlayerCameraLookAt(playerid,1576.4738,-1234.8547,151.6970);
SelectTextDraw(playerid, 0xFFFFFFFF);
return 1;
}
if(GetPVarInt(playerid, "loggined") == 1)
{
for(new i = 0; i < 7; i++)
{
TextDrawHideForPlayer(playerid,Logo[i]),TextDrawShowForPlayer(playerid,Logo[i]);
}
SetPlayerScore(playerid, pData[playerid][pLevel]);
SetPlayerHealth(playerid, 100.0);
SetPlayerSkin(playerid,pData[playerid][pSkin]);
SetPlayerVirtualWorld(playerid,0);
TogglePlayerControllable(playerid,1);
if(pData[playerid][pLevel] <= 3)
{
new spawnls = random(4);
if(spawnls == 0)
{
SetPlayerPos(playerid,1762.3660,-1893.1317,13.5606);
SetPlayerFacingAngle(playerid,270.7868);
}
if(spawnls == 1)
{
SetPlayerPos(playerid,1154.5562,-1768.4633,16.5938);
SetPlayerFacingAngle(playerid,1.7675);
}
if(spawnls == 2)
{
SetPlayerPos(playerid,1765.0052,-1903.4672,13.5663);
SetPlayerFacingAngle(playerid,270.7868);
}
if(spawnls == 3)
{
SetPlayerPos(playerid,1147.7163,-1768.9059,16.5992);
SetPlayerFacingAngle(playerid,0.7231);
}
}
if(pData[playerid][pLevel] > 3 && pData[playerid][pLevel] <= 8)
{
SetPlayerPos(playerid,-1969.0582,159.8374,27.6875);
SetPlayerFacingAngle(playerid,177.5901);
}
if(pData[playerid][pLevel] >= 9)
{
SetPlayerPos(playerid,2846.0134,1291.2833,11.3906);
SetPlayerFacingAngle(playerid,92.5072);
}
SetCameraBehindPlayer(playerid);
SetPlayerColor(playerid,0xFFFFFF11);
}
return 1;
}
OnPlayerDeath:

public OnPlayerDeath(playerid, killerid, reason)
{
for(new i = 0; i < 7; i++)
{
TextDrawHideForPlayer(playerid,Logo[i]);
}
return 1;
}

vovandolg
27.07.2016, 14:11
Ну так ты даже фикс не поставил)) поставь фикс на спавн,
когда будет что то не так напиши это сюда и вместе с ним выложи этот же код но с фиксом:crazy:

DeimoS
27.07.2016, 16:02
Во-первых, TogglePlayerSpectating автовызывает OnPlayerSpawn, если в неё передать false (0). Получается, что OnPlayerSpawn у тебя всегда срабатывает дважды.
Во-вторых, вся проблема в кривом обходе OnPlayerRequestClass (TogglePlayerSpectating твой как раз это и делает). Попробуй убрать свои обходы и добавить один из тех, что есть в моей теме, которую кидали выше

Glant
29.07.2016, 21:52
1)



public OnPlayerRequesClass(playerid, classid)
{
SetSpawnInfo(playerid, 0, NO_TEAM, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); // для F4
SpawnPlayer(playerid);

return 1;
}





2)
TogglePlayerSpectating(playerid, 0) нужно ставить там, где ты собираешься отправлять игрока в спавн в первый раз (после авторизации/регистрации), но никак не OnPlayerSpawn



// функция регистрации/авторизац
{
SetSpawnInfo(playerid, 0, NO_TEAM, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
TogglePlayerSpectating(playerid, 0);
}