PDA

Просмотр полной версии : [Вопрос] Краш сервера



Just_Fenix
11.05.2014, 21:15
Здравствуйте!
На сервере часто появляется краш. Появляется он после того как я начинаю следить за игроком. Если два раза подряд начать следить - то сервер выключается.
У меня слежка с панелью. Глобальные переменные

new PlayerSpec[MAX_PLAYERS];
new PlayerSpectateID[MAX_PLAYERS];
new Menu:reconmenu;
Колбэк OnPlayerCommandText

if(strcmp(cmd, "/re", true) == 0 || strcmp(cmd, "/recon", true) == 0)
{
if(pInfo[playerid][pAdmin] < 1) return SendClientMessage(playerid, COLOR_GRAD1, "Недостаточно прав для использования команды.");
tmp = strtok(cmdtext, idx);
if(!strlen(tmp)) return SendClientMessage(playerid, COLOR_GRAD1, "/re(con) [playerid]");
para1 = ReturnUser(tmp);
if(para1 == playerid) return SendClientMessage(playerid, COLOR_GRAD1, "Вы не можете следить за самим собой.");
if(!IsPlayerConnected(para1)) return SendClientMessage(playerid, COLOR_GRAD1, "Игрока нет на сервере.");
if(GetPlayerState(para1) == PLAYER_STATE_SPECTATING) return SendClientMessage(playerid, COLOR_GRAD1, "Этот игрок не вступил в игру.");
SetPlayerInterior(playerid, GetPlayerInterior(para1));
SetPlayerVirtualWorld(playerid, GetPlayerVirtualWorld(para1));
TogglePlayerSpectating(playerid, true);
if(GetPlayerVehicleID(para1)) PlayerSpectateVehicle(playerid, GetPlayerVehicleID(para1));
else PlayerSpectatePlayer(playerid, para1);
ShowMenuForPlayer(reconmenu,playerid);
PlayerSpectateID[playerid] = para1;
PlayerSpec[para1] = playerid;
return true;
}
Колбэк OnGameModeInit

reconmenu = CreateMenu("Panel", 1, 510.0, 120.0, 75.0);
AddMenuItem(reconmenu,0,"Update");
AddMenuItem(reconmenu,0,"Exit");

public OnPlayerSelectedMenuRow(playerid, row)
{
if(GetPlayerMenu(playerid) == reconmenu)
{
switch(row)
{
case 0:
{
new vehicle = GetPlayerVehicleID(PlayerSpec[PlayerSpectateID[playerid]]);
if(vehicle) PlayerSpectateVehicle(playerid, vehicle);
else PlayerSpectatePlayer(playerid, PlayerSpec[PlayerSpectateID[playerid]]);
ShowMenuForPlayer(reconmenu,playerid);
SendClientMessageToAll(COLOR_GREEN, "Слежка обновлена");
}
case 1:
{
TogglePlayerSpectating(playerid, false);
SetCameraBehindPlayer(playerid);
SendClientMessage(playerid, COLOR_YELLOW, "Наблюдение закончено.");
PlayerSpec[PlayerSpectateID[playerid]] = -1;
PlayerSpectateID[playerid] = -1;
DestroyMenu(reconmenu);
}
}
}
return 1;
}
Ну и если игрок нажал ENTER во время слежки, то отключаем его.
В колбэк OnPlayerKeyStateChange

if(newkeys & 16 && GetPlayerState(playerid) == PLAYER_STATE_SPECTATING)
{
TogglePlayerSpectating(playerid, false);
SetCameraBehindPlayer(playerid);
SendClientMessage(playerid, COLOR_YELLOW, "Наблюдение закончено.");
PlayerSpec[PlayerSpectateID[playerid]] = -1;
PlayerSpectateID[playerid] = -1;
DestroyMenu(reconmenu);
return 1;
}

PlayerSpec[PlayerSpectateID[playerid]] = -1;
PlayerSpectateID[playerid] = -1; - эти переменные у меня обнуляются при входе/выходе.
Также заметил в самом краше, что как-то не правильно работает стример. Версия стримера у меня 2.6.1 (( 2.7 багнутый )).
Краш:



--------------------------

SA-MP Server: 0.3z



Exception At Address: 0x00487CE0 Module: (samp-server.exe)



Registers:

EAX: 0x00000000 EBX: 0x00000001 ECX: 0x00000000 EDX: 0x00000001

ESI: 0x00000000 EDI: 0x00470000 EBP: 0x0367F45C ESP: 0x0018F74C

EFLAGS: 0x00010297



Stack:

+0000: 0x0200F808 0x03861F80 0x01FAC538 0x0369AB00

+0010: 0x00000000 0x0369AB01 0x00000001 0x00000018

+0020: 0x00000800 0x00000000 0x0018F779 0x01000101

+0030: 0x00000100 0x0018F7AC 0x76FB6A16 0x00000000

+0040: 0x00000000 0x0018F836 0x00000001 0x0018F834

+0050: 0x00000001 0x00000000 0x00000000 0x0018F834

+0060: 0x0018F7E4 0x76FAEAE2 0x00000000 0x00000100

+0070: 0x0018F834 0x00000001 0x0018F834 0x00000001

+0080: 0x76FC124C 0x00000000 0x00000000 0x00000065

+0090: 0x00000001 0x00000001 0x0018F810 0x76FA2E8A

+00A0: 0x00000000 0x00000100 0x0018F834 0x00000001

+00B0: 0x0018F834 0x00000001 0x00000010 0x00000065

+00C0: 0x00000001 0x00000001 0x0018F838 0x750A3EE5

+00D0: 0x0018F840 0x01FAC538 0x03676760 0x00499CD9

+00E0: 0x00000000 0x0018F855 0x00000000 0x00493D1A

+00F0: 0x00406BA8 0x00000000 0x01FAC538 0x0369AB00

+0100: 0x001C7898 0x00000001 0x00000031 0x0367EF38

+0110: 0x004065C5 0x03862798 0x03852960 0x00000003

+0120: 0x0018FB54 0x004A5DCB 0xFFFFFFFF 0x00473E7B

+0130: 0x00470000 0x01FAC538 0x0369AB00 0x00402BD0



--------------------------



Loaded Modules:

samp-server.exe A: 0x00400000 - 0x004F5000 (C:\Users\user\Desktop\Project\samp-server.exe)

ntdll.dll A: 0x773D0000 - 0x77550000 (C:\Windows\SysWOW64\ntdll.dll)

kernel32.dll A: 0x754D0000 - 0x755E0000 (C:\Windows\syswow64\kernel32.dll)

KERNELBASE.dll A: 0x76F80000 - 0x76FC7000 (C:\Windows\syswow64\KERNELBASE.dll)

SHELL32.dll A: 0x75A50000 - 0x7669A000 (C:\Windows\syswow64\SHELL32.dll)

msvcrt.dll A: 0x74EF0000 - 0x74F9C000 (C:\Windows\syswow64\msvcrt.dll)

SHLWAPI.dll A: 0x752B0000 - 0x75307000 (C:\Windows\syswow64\SHLWAPI.dll)

GDI32.dll A: 0x759C0000 - 0x75A50000 (C:\Windows\syswow64\GDI32.dll)

USER32.dll A: 0x75080000 - 0x75180000 (C:\Windows\syswow64\USER32.dll)

ADVAPI32.dll A: 0x758F0000 - 0x75990000 (C:\Windows\syswow64\ADVAPI32.dll)

sechost.dll A: 0x766C0000 - 0x766D9000 (C:\Windows\SysWOW64\sechost.dll)

RPCRT4.dll A: 0x75770000 - 0x75860000 (C:\Windows\syswow64\RPCRT4.dll)

SspiCli.dll A: 0x74E00000 - 0x74E60000 (C:\Windows\syswow64\SspiCli.dll)

CRYPTBASE.dll A: 0x74DF0000 - 0x74DFC000 (C:\Windows\syswow64\CRYPTBASE.dll)

LPK.dll A: 0x766B0000 - 0x766BA000 (C:\Windows\syswow64\LPK.dll)

USP10.dll A: 0x74FD0000 - 0x7506D000 (C:\Windows\syswow64\USP10.dll)

WSOCK32.dll A: 0x712F0000 - 0x712F7000 (C:\Windows\system32\WSOCK32.dll)

WS2_32.dll A: 0x76900000 - 0x76935000 (C:\Windows\syswow64\WS2_32.dll)

NSI.dll A: 0x75750000 - 0x75756000 (C:\Windows\syswow64\NSI.dll)

WINMM.dll A: 0x73E40000 - 0x73E72000 (C:\Windows\system32\WINMM.dll)

IMM32.DLL A: 0x769F0000 - 0x76A50000 (C:\Windows\system32\IMM32.DLL)

MSCTF.dll A: 0x766E0000 - 0x767AC000 (C:\Windows\syswow64\MSCTF.dll)

streamer.DLL A: 0x6CA60000 - 0x6CA9E000 (C:\Users\user\Desktop\Project\plugins\streamer.DLL)

MSVCP100.dll A: 0x6A4C0000 - 0x6A529000 (C:\Windows\system32\MSVCP100.dll)

MSVCR100.dll A: 0x652C0000 - 0x6537F000 (C:\Windows\system32\MSVCR100.dll)

mswsock.dll A: 0x72D80000 - 0x72DBC000 (C:\Windows\system32\mswsock.dll)

wshtcpip.dll A: 0x73040000 - 0x73045000 (C:\Windows\System32\wshtcpip.dll)

NLAapi.dll A: 0x73920000 - 0x73930000 (C:\Windows\system32\NLAapi.dll)

napinsp.dll A: 0x73680000 - 0x73690000 (C:\Windows\system32\napinsp.dll)

pnrpnsp.dll A: 0x73660000 - 0x73672000 (C:\Windows\system32\pnrpnsp.dll)

DNSAPI.dll A: 0x71E60000 - 0x71EA4000 (C:\Windows\system32\DNSAPI.dll)

winrnr.dll A: 0x734B0000 - 0x734B8000 (C:\Windows\System32\winrnr.dll)

WLIDNSP.DLL A: 0x73010000 - 0x73037000 (C:\Program Files (x86)\Common Files\Microsoft Shared\Windows Live\WLIDNSP.DLL)

PSAPI.DLL A: 0x769E0000 - 0x769E5000 (C:\Windows\syswow64\PSAPI.DLL)

IPHLPAPI.DLL A: 0x72770000 - 0x7278C000 (C:\Windows\system32\IPHLPAPI.DLL)

WINNSI.DLL A: 0x72760000 - 0x72767000 (C:\Windows\system32\WINNSI.DLL)

rasadhlp.dll A: 0x72D00000 - 0x72D06000 (C:\Windows\system32\rasadhlp.dll)

Just_Fenix
12.05.2014, 15:11
Эта проблема возможна из-за Gta San Andreas?
У меня там просто русификатор стоит и пару модов.
Она у меня часто вылетает.

DeimoS
12.05.2014, 16:45
Больше информации. Выключается только у вас (вылетает с сервера) или же серверный процесс полностью? Где сервер запускаете (дом/хостинг)?
И подключите крашдетект, перекомпилировав мод с режимом отладки -d3. Далее доведите мод до краша и скиньте логи сервера

Just_Fenix
12.05.2014, 17:20
Сервер запускается дома. Выключается серверный процесс (samp-server).
Что показал crashdetect:


----------
Loaded log file: "server_log.txt".
----------

SA-MP Dedicated Server
----------------------
v0.3z, (C)2005-2014 SA-MP Team

[18:15:18] filterscripts = "" (string)
[18:15:18]
[18:15:18] Server Plugins
[18:15:18] --------------
[18:15:18] Loading plugin: streamer
[18:15:18]

*** Streamer Plugin v2.6.1 by Incognito loaded ***

[18:15:18] Loaded.
[18:15:18] Loading plugin: crashdetect
[18:15:18] CrashDetect v4.13.1 is OK.
[18:15:18] Loaded.
[18:15:18] Loaded 2 plugins.

[18:15:18]
[18:15:18] Filterscripts
[18:15:18] ---------------
[18:15:18] Loaded 0 filterscripts.

[18:15:18] ====================================================|
[18:15:18] Мод успешно запущен!
[18:15:18] ====================================================|
[18:15:18] Number of vehicle models: 2
[18:15:48] Incoming connection: 5.79.202.220:55044
[18:15:49] [join] Just_Fenix has joined the server (0:5.79.202.220)
[18:16:31] Incoming connection: 176.59.180.179:9305
[18:16:32] [join] Dima_Fletch has joined the server (1:176.59.180.179)
[18:17:49] [debug] Server crashed while executing server.amx
[18:17:49] [debug] AMX backtrace:
[18:17:49] [debug] #0 native ShowMenuForPlayer () [00473e30] from samp-server.exe
[18:17:49] [debug] #1 000123d8 in public OnPlayerCommandText (playerid=0, cmdtext[]=@0x001c4300 "/re 1") at C:\Users\user\Desktop\Server\gamemodes\server.pwn:824
[18:17:49] [debug] Native backtrace:
[18:17:49] [debug] #0 00487ce0 in ?? () from samp-server.exe
[18:17:49] [debug] #1 6ed949ca in AmxCallback () from plugins\crashdetect.DLL
[18:17:49] [debug] #2 6ed9681f in amx_Exec () from plugins\crashdetect.DLL
[18:17:49] [debug] #3 6ed89b84 in CrashDetect::DoAmxExec () from plugins\crashdetect.DLL
[18:17:49] [debug] #4 6ed94a1a in AmxExec () from plugins\crashdetect.DLL
[18:17:49] [debug] #5 0046cfd0 in ?? () from samp-server.exe
[18:17:49] [debug] #6 00452970 in ?? () from samp-server.exe
[18:17:49] [debug] #7 00499cd9 in ?? () from samp-server.exe
[18:17:49] [debug] #8 004a50fe in ?? () from samp-server.exe

Команда с ошибкой:

if(strcmp(cmd, "/re", true) == 0 || strcmp(cmd, "/recon", true) == 0)
{
if(pInfo[playerid][pAdmin] < 1) return SendClientMessage(playerid, COLOR_GRAD1, "Недостаточно прав для использования команды.");
tmp = strtok(cmdtext, idx);
if(!strlen(tmp)) return SendClientMessage(playerid, COLOR_GRAD1, "/re(con) [playerid]");
para1 = ReturnUser(tmp);
if(para1 == playerid) return SendClientMessage(playerid, COLOR_GRAD1, "Вы не можете следить за самим собой.");
if(!IsPlayerConnected(para1)) return SendClientMessage(playerid, COLOR_GRAD1, "Игрока нет на сервере.");
if(GetPlayerState(para1) == PLAYER_STATE_SPECTATING) return SendClientMessage(playerid, COLOR_GRAD1, "Этот игрок не вступил в игру.");
SetPlayerInterior(playerid, GetPlayerInterior(para1));
SetPlayerVirtualWorld(playerid, GetPlayerVirtualWorld(para1));
TogglePlayerSpectating(playerid, true);
if(GetPlayerVehicleID(para1)) PlayerSpectateVehicle(playerid, GetPlayerVehicleID(para1));
else PlayerSpectatePlayer(playerid, para1);
ShowMenuForPlayer(reconmenu,playerid); //строчка 824, ошибка здесь.
PlayerSpectateID[playerid] = para1;
PlayerSpec[para1] = playerid;
return true;
}

DeimoS
12.05.2014, 18:32
То бишь, при повторном вводе команды сервер выключается?

- - - Добавлено - - -

Попробуйте перед ShowMenu поставить

HideMenuForPlayer( reconmenu, playerid );

Just_Fenix
12.05.2014, 18:49
Как бы так сказать. Я два-три раза нажимаю "Update" в панельки. Камера не обновляется (там что-то не правильно в OnPlayerSelectedMenuRow). Нажимаю EXIT, администратор выходит из слежки. Я сразу снова набираю команду /re 1 и сервер выключается.

- - - Добавлено - - -


То бишь, при повторном вводе команды сервер выключается?

- - - Добавлено - - -

Попробуйте перед ShowMenu поставить

HideMenuForPlayer( reconmenu, playerid );

При повторном использовании команды - панель не появляется.
И сервер выключился. Log server:

[19:41:19] [debug] Server crashed while executing server.amx
[19:41:19] [debug] AMX backtrace:
[19:41:19] [debug] #0 native HideMenuForPlayer () [00473ea0] from samp-server.exe
[19:41:19] [debug] #1 000123d8 in public OnPlayerCommandText (playerid=0, cmdtext[]=@0x001c4300 "/re 1") at C:\Users\user\Desktop\Server\gamemodes\server.pwn:824
[19:41:19] [debug] Native backtrace:
[19:41:19] [debug] #0 00487da6 in ?? () from samp-server.exe
[19:41:19] [debug] #1 6fef49ca in AmxCallback () from plugins\crashdetect.DLL
[19:41:19] [debug] #2 6fef681f in amx_Exec () from plugins\crashdetect.DLL
[19:41:19] [debug] #3 6fee9b84 in CrashDetect::DoAmxExec () from plugins\crashdetect.DLL
[19:41:19] [debug] #4 6fef4a1a in AmxExec () from plugins\crashdetect.DLL
[19:41:19] [debug] #5 0046cfd0 in ?? () from samp-server.exe
[19:41:19] [debug] #6 00452970 in ?? () from samp-server.exe
[19:41:19] [debug] #7 6fef4a1a in AmxExec () from plugins\crashdetect.DLL
[19:41:19] [debug] #8 0046db90 in ?? () from samp-server.exe
[19:41:19] [debug] #9 00499cd9 in ?? () from samp-server.exe
[19:41:19] [debug] #10 0045b39a in ?? () from samp-server.exe
[19:41:19] [debug] #11 75d8149d in ?? () from C:\Windows\syswow64\KERNELBASE.dll
[19:41:19] [debug] #12 75d814d0 in ?? () from C:\Windows\syswow64\KERNELBASE.dll

- - - Добавлено - - -

Ошибка (стр.824) теперь здесь - HideMenuForPlayer(reconmenu,playerid);

DeimoS
12.05.2014, 19:27
А если на место 824 строки, например,

print("lol");
поставить. На что крашдетект будет ругаться

Just_Fenix
12.05.2014, 19:39
А если на место 824 строки, например,

print("lol");
поставить. На что крашдетект будет ругаться


----------
Loaded log file: "server_log.txt".
----------

SA-MP Dedicated Server
----------------------
v0.3z, (C)2005-2014 SA-MP Team

[20:33:53] filterscripts = "" (string)
[20:33:53]
[20:33:53] Server Plugins
[20:33:53] --------------
[20:33:53] Loading plugin: streamer
[20:33:53]

*** Streamer Plugin v2.6.1 by Incognito loaded ***

[20:33:53] Loaded.
[20:33:53] Loading plugin: crashdetect
[20:33:53] CrashDetect v4.13.1 is OK.
[20:33:53] Loaded.
[20:33:53] Loaded 2 plugins.

[20:33:53]
[20:33:53] Filterscripts
[20:33:53] ---------------
[20:33:53] Loaded 0 filterscripts.

[20:33:53] ====================================================|
[20:33:53] Сервер успешно запущен!
[20:33:53] ====================================================|
[20:33:53] Number of vehicle models: 2
[20:34:17] Incoming connection: 5.79.202.220:64210
[20:34:17] [join] Just_Fenix has joined the server (0:5.79.202.220)
[20:34:45] Incoming connection: 176.59.180.179:9534
[20:34:45] [join] Dima_Fletcher has joined the server (1:176.59.180.179)
[20:35:55] lol
[20:36:17] lol
[20:36:17] [debug] Server crashed while executing server.amx
[20:36:17] [debug] AMX backtrace:
[20:36:17] [debug] #0 native HideMenuForPlayer () [00473ea0] from samp-server.exe
[20:36:17] [debug] #1 00012400 in public OnPlayerCommandText (playerid=0, cmdtext[]=@0x001c4310 "/re 1") at C:\Users\user\Desktop\Server\gamemodes\server.pwn:825
[20:36:17] [debug] Native backtrace:
[20:36:17] [debug] #0 00487da6 in ?? () from samp-server.exe
[20:36:17] [debug] #1 6fef49ca in AmxCallback () from plugins\crashdetect.DLL
[20:36:17] [debug] #2 6fef681f in amx_Exec () from plugins\crashdetect.DLL
[20:36:17] [debug] #3 6fee9b84 in CrashDetect::DoAmxExec () from plugins\crashdetect.DLL
[20:36:17] [debug] #4 6fef4a1a in AmxExec () from plugins\crashdetect.DLL
[20:36:17] [debug] #5 0046cfd0 in ?? () from samp-server.exe
[20:36:17] [debug] #6 00452970 in ?? () from samp-server.exe
[20:36:17] [debug] #7 0046e912 in ?? () from samp-server.exe
[20:36:17] [debug] Server crashed while executing server.amx
[20:36:17] [debug] AMX backtrace:
[20:36:17] [debug] #0 native HideMenuForPlayer () [00473ea0] from samp-server.exe
[20:36:17] [debug] #1 00012400 in public OnPlayerCommandText (playerid=0, cmdtext[]=@0x001c4310 "/re 1") at C:\Users\user\Desktop\Server\gamemodes\server.pwn:825
[20:36:17] [debug] Native backtrace:
[20:36:17] [debug] #0 777edfe4 in ?? () from C:\Windows\SysWOW64\ntdll.dll
[20:36:17] [debug] #1 755c14ad in ?? () from C:\Windows\syswow64\kernel32.dll
[20:36:17] [debug] #2 00493bf1 in ?? () from samp-server.exe
[20:36:17] [debug] #3 0044e129 in ?? () from samp-server.exe
[20:36:17] [debug] #4 00458bcc in ?? () from samp-server.exe
[20:36:17] [debug] #5 0045b39a in ?? () from samp-server.exe
[20:36:17] [debug] #6 75d8149d in ?? () from C:\Windows\syswow64\KERNELBASE.dll
[20:36:17] [debug] #7 75d814d0 in ?? () from C:\Windows\syswow64\KERNELBASE.dll

DeimoS
12.05.2014, 19:42
А, случаем, нигде меню это не уничтожаете?

//UPD
Ну конечно...

TogglePlayerSpectating(playerid, false);
SetCameraBehindPlayer(playerid);
SendClientMessage(playerid, COLOR_YELLOW, "Наблюдение закончено.");
PlayerSpec[PlayerSpectateID[playerid]] = -1;
PlayerSpectateID[playerid] = -1;
DestroyMenu(reconmenu);
Вы при окончании слежки уничтожаете меню... И потом вызываете несуществующее...

DestroyMenu(reconmenu);
на

HideMenuForPlayer( reconmenu, playerid );

Just_Fenix
12.05.2014, 19:53
Спасибо. Работает)
Чтобы ещё одну тему не создавать, не могли бы вы подсказать, что я сделал не правильно?

case 0:
{
new vehicle = GetPlayerVehicleID(PlayerSpec[PlayerSpectateID[playerid]]);
if(vehicle) PlayerSpectateVehicle(playerid, vehicle);
else PlayerSpectatePlayer(playerid, PlayerSpec[PlayerSpectateID[playerid]]);
ShowMenuForPlayer(reconmenu,playerid);
SendClientMessageToAll(COLOR_GREEN, "Слежка обновлена");
}
Все знают, если игрок сядет в авто (а администратор в это время будет за ним следить), то у администратора камера будет неудобно показывать. В панели "update" обновляет слежку за игроком, которого указали при команде /re. Суть в том, что камера не обновляется. Если даже игрок выйдет из авто и побежит куда-нибудь далеко, то камера останется следить за машиной.

DeimoS
12.05.2014, 20:05
Хмм, даже не знаю... Давно уже не работал с функциями PlayerSpectate. Попробуйте прологировать все значения (ID машины игрока. Какая из проверок срабатывает. Всё, что может помочь в понимании того, как срабатывает код сейчас и как сделать, чтоб срабатывал правильно)

Just_Fenix
12.05.2014, 20:16
Хмм, даже не знаю... Давно уже не работал с функциями PlayerSpectate. Попробуйте прологировать все значения (ID машины игрока. Какая из проверок срабатывает. Всё, что может помочь в понимании того, как срабатывает код сейчас и как сделать, чтоб срабатывал правильно)
Буду пробовать сам делать :)
Спасибо что помогли в общем :acute:
Модераторы могут закрывать тему.

DeimoS
12.05.2014, 20:19
Буду пробовать сам делать :)
Спасибо что помогли в общем :acute:
Модераторы могут закрывать тему.
Та не спешите закрывать :) Сделайте логи и скиньте сюда. Вместе обмозгуем и сделаем. Кто-нибудь нуждающийся в будущем найдёт тему и будет счастлив

Just_Fenix
12.05.2014, 20:36
case 0:
{
printf("игрок %s обновил слежку за игроком %s", pNick(playerid), pNick(PlayerSpec[PlayerSpectateID[playerid]]));
new vehicle = GetPlayerVehicleID(PlayerSpec[PlayerSpectateID[playerid]]);
printf("игрок %s следит за игроком %s", pNick(playerid), pNick(PlayerSpec[PlayerSpectateID[playerid]]));
if(vehicle) PlayerSpectateVehicle(playerid, vehicle), printf("игрок %s следит за игроком %s который в машине", pNick(playerid), pNick(PlayerSpec[PlayerSpectateID[playerid]]));
else PlayerSpectatePlayer(playerid, PlayerSpec[PlayerSpectateID[playerid]]); printf("игрок %s следит за игроком который пешком", pNick(playerid));
ShowMenuForPlayer(reconmenu,playerid); printf("игроку %s показали панель", pNick(playerid));
//SendClientMessageToAll(COLOR_GREEN2, "Cлежка обновлена");
}
Последовательность моих действий:
1) Я включил слежку за игроком ID 1
2) Обновил слежку через панель (ID 1 пешком)
3) ID 1 сел в машину.
4) Я обновил слежку.
5) ID 1 вышел из машины.
6) Я обновил слежку и выключил сервер.
Logs server:

[21:30:52] игрок Just_Fenix обновил слежку за игроком Just_Fenix
[21:30:52] игрок Just_Fenix следит за игроком Just_Fenix
[21:30:52] игрок Just_Fenix следит за игроком который пешком
[21:30:52] игроку Just_Fenix показали панель
[21:31:17] игрок Just_Fenix обновил слежку за игроком Just_Fenix
[21:31:17] игрок Just_Fenix следит за игроком Just_Fenix
[21:31:17] игрок Just_Fenix следит за игроком который пешком
[21:31:17] игроку Just_Fenix показали панель
[21:31:25] игрок Just_Fenix обновил слежку за игроком Just_Fenix
[21:31:25] игрок Just_Fenix следит за игроком Just_Fenix
[21:31:25] игрок Just_Fenix следит за игроком который пешком
[21:31:25] игроку Just_Fenix показали панель
[21:31:30] [part] Just_Fenix has left the server (0:1)
Мне кажется что не правильно записывается ID игрока за которым начали слежку.
Вывод я этот сделал по этому: pNick(PlayerSpec[PlayerSpectateID[playerid]]). Вот и не обновляется)
Если не прав - поправьте меня пж)

DeimoS
12.05.2014, 20:54
Эмм, PlayerSpec хранит ID игрока, который начал следить, как я понимаю.
PlayerSpectateID хранит ID игрока, за которым начали следить.
Если так, то почему вы пытаетесь извлечь ID игрока, за которым следят, так:

PlayerSpec[PlayerSpectateID[playerid]]
Получается, что вы узнаёте ID игрока, который следит, а не за которым следят. И проверяете его. Может я и не прав...

Just_Fenix
12.05.2014, 21:08
Я так понимаю - эта проверка лишняя. Она нигде не используется.

// в конце команды /recon.
PlayerSpec[para1] = playerid;
Сейчас к сожалению я не могу проверить вашу версию.

DeimoS
13.05.2014, 05:00
Вот так нужно:

public OnPlayerSelectedMenuRow(playerid, row)
{
if(GetPlayerMenu(playerid) == reconmenu)
{
switch(row)
{
case 0:
{
new vehicle = GetPlayerVehicleID(PlayerSpectateID[playerid]);
if(vehicle) PlayerSpectateVehicle(playerid, vehicle);
else PlayerSpectatePlayer(playerid, PlayerSpectateID[playerid]);
ShowMenuForPlayer(reconmenu,playerid);
SendClientMessageToAll(COLOR_GREEN, "Слежка обновлена");
}
case 1:
{
TogglePlayerSpectating(playerid, false);
SetCameraBehindPlayer(playerid);
SendClientMessage(playerid, COLOR_YELLOW, "Наблюдение закончено.");
PlayerSpec[PlayerSpectateID[playerid]] = -1;
PlayerSpectateID[playerid] = -1;
HideMenuForPlayer( reconmenu, playerid );
}
}
}
return 1;
}

А вот этим кодом

PlayerSpec[PlayerSpectateID[playerid]]
Мы возвращали ID игрока, который следит за игроком.

Just_Fenix
13.05.2014, 16:07
Вы были правы :)
Всё работает, огромное спасибо)
Теперь можно закрывать тему:)