PDA

Просмотр полной версии : [Вопрос] Некорректная смерть / Игрок не умирает



felix_font
06.08.2014, 20:52
Здравствуйте.
Уже недели 2 я не могу разобрать данный баг и причину возникновения.

Вообщем объясняю:
Игрок умирает (или его убивают) он стоит мертвый и может ходить, также может стрелять, но урон не наносит.
Другим игрокам видно что он лежит на земле (когда он стреляет видно что летят пули, но они не наносят урон)
Если игрок во время этого бага пригнет с высоти или в него стрельнут еще раз, он нормально умрет и респавнится в нужном месте.

Предоставляю вам спавн и деатх функцию:


public OnPlayerSpawn(playerid)
{
PlayerPlaySound(playerid,1063,0.0,0.0,0.0);
TextDrawShowForPlayer(playerid, ServerLogo[0]), TextDrawShowForPlayer(playerid, ServerLogo[1]), TextDrawShowForPlayer(playerid, ServerLogo[2]), TextDrawShowForPlayer(playerid, ServerLogo[3]);
if(!GetPVarInt(playerid, "Logged"))
{
send(playerid, "Прежде чем заспавниться, нужно быть авторизированым.");
return 1;
}
if(uInfo[playerid][pJustConnected])
{
uInfo[playerid][pJustConnected] = false;
SendClientMessage(playerid, COLOR_WHITE, "Для ознакомление с сервером введите команду /help");
}

SetTimerEx("UpdatePlayerInfo", 300, false, "d", playerid);
ChangeSpawnInfo(playerid, .post = 1);
SetPlayerHealth(playerid, 1000.0), SetTimerEx("SpawnShieldDisable", 2000, false, "d", playerid);

for(new i = 0; i < 10; i++) SetPlayerSkillLevel(playerid, i, 1000);

return 1;
}

public OnPlayerDeath(playerid, killerid, reason)
{
new animlib[32], animname[32];
GetAnimationName(uInfo[playerid][pLastAnim],animlib,32,animname,32);
if(strcmp(animlib, "PED", true) != 0) ClearAnimations(playerid);

if(killerid == INVALID_PLAYER_ID) SendDeathMessage(INVALID_PLAYER_ID,playerid,reason);
else
{
// Killer
SendDeathMessage(killerid,playerid,reason);
pInfo[killerid][pKills] += 1;
pInfo[killerid][pMoney] += 100;
SetPlayerInfo(killerid);

// Victim
pInfo[playerid][pDeaths] += 1;

if(TDM_Info[TDM_Started] == true)
{
switch(uInfo[playerid][pTeam])
{
case 1: TDM_Info[TDM_Score_2] += 1;
case 2: TDM_Info[TDM_Score_1] += 1;
}
new temp[48];
format(temp, 48, "~r~You killed by %s", uInfo[killerid][pName]);
GameTextForPlayer(playerid, temp, 2000, 5);
}
if(uInfo[killerid][pZoneType] == DeathMatchZone)
{
new Float:health;
GetPlayerHealth(killerid, health);

if(health < 51) SetPlayerHealth(killerid, (health+50.0));
else SetPlayerHealth(killerid, 100.0);
}
if(uInfo[killerid][pZoneType] == RaceDeathMatchZone)
{
RDM_PlayerKills[killerid] += 1;
if(RDM_PlayerKills[killerid] > RDM_Info[RDM_LeaderKills])
{
RDM_Info[RDM_LeaderIndex] = killerid;
RDM_Info[RDM_LeaderKills] = RDM_PlayerKills[killerid];
}
}

if(pInfo[killerid][pKills] > TopStats[20][TS_Kills]) TopStats_Update(killerid);
}

ChangeSpawnInfo(playerid);
return 1;
}



new animlib[32], animname[32];
GetAnimationName(uInfo[playerid][pLastAnim],animlib,32,animname,32);
if(strcmp(animlib, "PED", true) != 0) ClearAnimations(playerid);

Этот код я нашел в интернете, он вроде должен был исправить данный баг. Но.... Он его не исправляет. Если убрать этот код, то баг остается.

p.s. Раньше этот баг был потому как в Spawn Post не было *return 1;* потому был баг, сегодня он снова появился, хотя ретурн на месте.

Буду очень благодарен если поможете исправить баг или подсказать в чем причина.
Т.к. это единственный баг который я не могу пофиксить.

L0ndl3m
06.08.2014, 20:56
Интересно. Обычно так бывает, когда игрок умирает в тот момент, когда он горит.

Что за функция ChangeSpawnInfo?

Salvacore
06.08.2014, 21:01
Интересно. Обычно так бывает, когда игрок умирает в тот момент, когда он горит.

Что за функция ChangeSpawnInfo?


SetSpawnInfo в OnPlayerDeath ведь можно использовать?
[18:43:54] Салвакоръ: А что ща функция вообще?

felix_font
06.08.2014, 21:02
#define SetPlayerSpawnInfo(%0,%1,%2,%3,%4,%5,%6) SetSpawnInfo(%0, %1, %2, %3, %4, %5, %6, -1 ,-1, -1, -1, -1, -1)

stock ChangeSpawnInfo(i, post = 0)
{
if(post == 0) {
new rand;
switch(uInfo[i][pZone])
{
case VW_SpawnZone:
{
rand = random(sizeof(SpawnsZone_1));
SetPlayerSpawnInfo(i, 255, uInfo[i][pSkin], SpawnsZone_1[rand][0], SpawnsZone_1[rand][1], SpawnsZone_1[rand][2], SpawnsZone_1[rand][3]);
}
}
}
else {
switch(uInfo[i][pZone])
{
case VW_SpawnZone:
{
ResetPlayerWeapons(i);
SetPlayerTeam(i, 255);
SetPlayerVirtualWorld(i, 0);
SetPlayerInterior(i, 0);
SetPlayerHealthEx(i, 100);
SetPlayerArmour(i, 0);
SetPlayerWeather(i, 12);
SetPlayerTime(i, 16, 0);
}
}
}
}

Функцию обрезал. Там были кейси для всех зон.
Я думаю хватает спавн зоны, т.к. там тоже есть этот баг.

Если еще что-то дать. Говорите.
p.s. Могу дать только части кода, весь мод увы не дам)

L0ndl3m
06.08.2014, 21:04
Попробуйте убрать эту функцию в конце паблика.

felix_font
06.08.2014, 21:09
Ах да, постояв в афк минут 20, баг почему-то пропал.
Магия вне хогвардса....
Вот этот баг иногда есть а иногда нет.

Щас попробую потестить без этого.
Однако без этой функции не обойтись.
Этот баг не всегда есть, потому чтобы узнать остался ли баг нужно не мало времени.
Куда тогда эту функцию засунуть?

Может в функцию "OnPlayerStateChange"
С условием "if(newstate == PLAYER_STATE_WASTED)" (Игрок умер или находится в выборе класса);

felix_font
07.08.2014, 00:52
Отключил все связанное со спавном и авторизацией.
Баг остался.

Завтра попробую до конца закоментировать остальной код мода.

felix_font
09.08.2014, 23:32
Вроде бы нашел причину бага.
Хотя причина не точная....
Данная проблема возникала при включенном собейте (видимо он кривой).
Хотя на сколько я помню когда тестил с другом, у него был тот же баг но без собейта.
Т.к. никто не вкурсе данной проблемы - модеры закройте тему.
Всем спасибо кто пытались помочь.

Salvacore
10.08.2014, 00:47
Увы, закрыто.