reconnect и timer
| | |
_wS_
|
Дата: Четверг, 10.05.2012, 10:22:29 | Сообщение # 2 |
|
Только если запоминать игрока по Стиму или IP, т.к. после реконекта его индекс может быть уже другим. Если игрок вышел, добавь его стим в Keyvalues и через нужное вермя удали. Если игрок заходит и он есть в Keyvalues, значит .. (ты лучше знаешь что делать). Только надо не забывать убивать таймеры в нужный момент, а то путаница будет.
|
|
| |
Scarface_slv
|
Дата: Суббота, 12.05.2012, 23:23:44 | Сообщение # 3 |
|
Сообщений: 737
Репутация: 61 [ +/- ]
|
|
Спасибо буду пробывать, как то не знаю, получается вышел игрок, запускается таймер, как 60 сек закончатся проверяется с Keyvalues файла игрок есть ли он или нет на сервере по стим или ип, если нет удаляются таймеры да? У меня с логикой плохо... Но как остановить первый таймер аааа как же это муторно =(Добавлено (12.05.2012, 23:22:57) --------------------------------------------- у меня такой вопрос есть стимы которые хранятся в переменой disconnected_player_authids[pos] и я пытаюсь проверить эти стим иды со стим идами игроков которые на сервере как это сделать? Code public Action:Times(Handle:timer, any:t) { for (new x=queue_get_size()-1; x>=0; --x) { new pos = queue_translate_pos(x); PrintToChatAll("%s", disconnected_player_authids[pos]); } decl String:steam_id[32]; for (new i = 1; i <= MaxClients; i++) { if (IsClientInGame(i)) { GetClientAuthString(i, steam_id, sizeof(steam_id)); if (StrEqual(disconnected_player_authids[pos], steam_id, true)) PrintToChatAll("%s = %s", disconnected_player_authids[pos], steam_id); else PrintToChatAll("%s не равны %s", disconnected_player_authids[pos], steam_id); } } } вообщем disconnected_player_authids[pos] проверяет тока первый стим ид, и если находит его на сервере то пишет что равны остальные стим иды он не проверяет Добавлено (12.05.2012, 23:23:44) --------------------------------------------- которые в disconnected_player_authids[pos] храняться
|
|
| |
_wS_
|
Дата: Суббота, 12.05.2012, 23:42:10 | Сообщение # 4 |
|
Допустим, у нас в String:Steam_Baz[MAXPLAYERS+1][25] стимы игроков. Чтобы узнать, есть ли стим игрока в Steam_Baz, делаем так:
Code bool:SteaMFound(client) { decl String:SteaM[25]; GetClientAuthString(client, SteaM, 25); for (new i = 1; i <= MaxClients; i++) { if (StrEqual(SteaM, Steam_Baz[i])) return true; } return false; }
// чтобы всех проверить: for (new i = 1; i <= MaxClients; i++) { if (IsClientInGame(i) && SteaMFound(i)) PrintToChatAll("Стим игрока %N есть в Steam_Baz", i); } ----- Ой, я ошибся немного, не if (IsClientInGame(i) && SteaMFound(client)) а: if (IsClientInGame(i) && SteaMFound(i))
|
|
| |
Scarface_slv
|
Дата: Воскресенье, 13.05.2012, 14:01:21 | Сообщение # 5 |
|
Сообщений: 737
Репутация: 61 [ +/- ]
|
|
Спасибо те большое пойду проверятьДобавлено (13.05.2012, 14:01:21) --------------------------------------------- у каждого при заходе на сервер запускается таймер, мне нужно что бы при выходе игрока сервера сохранился не законченный таймер можно так сделать? Code public Action:PlayerDisconnect(Handle:event, const String:name[], bool:dont_broadcast) { new i = GetClientOfUserId(GetEventInt(event, "userid")); if (!IsFakeClient(i)) { decl String:steam_id[25]; GetClientAuthString(i, steam_id, 25); KvJumpToKey(KV, steam_id, true); KvSetString(KV, "time", timers[i]); KvRewind(KV); KeyValuesToFile(KV, "x.txt"); } KillTimer(timers[i]); timers[i] = INVALID_HANDLE; }
|
|
| |
_wS_
|
Дата: Воскресенье, 13.05.2012, 15:28:11 | Сообщение # 6 |
|
Делать KeyValuesToFile при каждом выходе игрока плохо. Перед убийством таймера надо проверить, жив ли он еще, иначе ошибка будет.
Code if (timers[i] != INVALID_HANDLE) { KillTimer(timers[i]); timers[i] = INVALID_HANDLE; } KvSetString(KV, "time", timers[i]); - думаю это бессмысленно, зачем сохранять Handle таймера, если ты его убиваешь? Тебе надо сохранять секунды.
Устанавливаешь, например, 60 сек, и запускаешь таймер с флагом TIMER_REPEAT и задержкой 1.0 сек. Внутри функции таймера отнимаешь от секунд SEC[client] -= 1; После выхода игрока сохраняешь его секунды.
Хотя я плохо понимаю что ты хочешь сделать, что за таймеры у тебя, что делают и какие.
|
|
| |
Scarface_slv
|
Дата: Воскресенье, 13.05.2012, 18:13:06 | Сообщение # 7 |
|
Сообщений: 737
Репутация: 61 [ +/- ]
|
|
я хочу что бы при заходе игрока таймер запустился на час, если за это время игрок выйдет или еще что, таймер сохраниться на 1 минуту и если за минуту он не зайдет то удалит а если зайдет то продолжит таймер, 3 дня мучаюсь как тока не пробую...Добавлено (13.05.2012, 18:13:06) --------------------------------------------- а где инфа храниться если нет KeyValuesToFile? работает без него но не понятно где все храниться
|
|
| |
_wS_
|
Дата: Воскресенье, 13.05.2012, 18:26:29 | Сообщение # 8 |
|
Quote (Scarface_slv) а где инфа храниться если нет KeyValuesToFile? работает без него но не понятно где все храниться Там и хранится =) В созданной структуре KeyValues. KeyValuesToFile делают лишь для того, чтобы данные можно было использовать и после перезапуска сервера. Они заносятся в файл, из которого их позже можно будет загрузить с помощью FileToKeyValues и снова использовать. Т.е. если данные тебе не нужны после отключения сервера, нет смысла делать KeyValuesToFile.
То, что ты хочешь сделать - это сложная задача, я начал делать и передумал, напряжно (но возможно).
|
|
| |
Scarface_slv
|
Дата: Воскресенье, 13.05.2012, 21:11:12 | Сообщение # 9 |
|
Сообщений: 737
Репутация: 61 [ +/- ]
|
|
я тоже забью на нее уже бесит, сделал тока что при выходе игрока начался отчет 1 минута если за это время зайдет то... если нет то... а вот со вторым таймером который должен работать при входе игрока при выходе сохраниться а потом запуститься снова если игрок зайдет вот с ним полный бред, смог сохранить его но запустить снова(с Float устал).... если уж для тебя напряженно для меня это хаус понаписал там бред по моему... Может кому нить нужен будет для примера скрипт:
Гости не могут скачивать файлы
|
|
|
| |
_wS_
|
Дата: Воскресенье, 13.05.2012, 23:42:18 | Сообщение # 10 |
|
Сделал, попробуй. Вроде все правильно работает. Перезаходи в игру, в чат будет писать сколько осталось до вызова функции. И попробуй не заходить в течение DEL_SEC, чтобы таймер сбросился.
Quote (Scarface_slv) понаписал там бред по моему Ничего, если есть желание, научишься =)
Гости не могут скачивать файлы
|
|
|
| |
Scarface_slv
|
Дата: Понедельник, 14.05.2012, 09:40:09 | Сообщение # 11 |
|
Сообщений: 737
Репутация: 61 [ +/- ]
|
|
Спасибо тебе большое!!!! Добавлено (14.05.2012, 08:42:31) --------------------------------------------- переменная new FINISH_SEC = 60; должна сменить секунды Finish_Func но почему при заходе он все равно пишет 60 осталось если я меняю ее на другие числа, например 70 sorry что достал тебя с глупыми вопросами... Добавлено (14.05.2012, 09:40:09) --------------------------------------------- ой нет все работает еще раз СПАСИБО
|
|
| |
_wS_
|
Дата: Понедельник, 14.05.2012, 13:29:01 | Сообщение # 12 |
|
Пжалст =) Только главное чтобы ты сам понял как работает скрипт. Урок про CreateTrie() есть.
|
|
| |
Scarface_slv
|
Дата: Среда, 16.05.2012, 12:43:25 | Сообщение # 13 |
|
Сообщений: 737
Репутация: 61 [ +/- ]
|
|
CreateTrie() как я понял в скрипте сохраняет стим ид и сек и получ когда нужно, терь мучаюсь с последней проблемой это повтор таймера FINISH_SEC =)Добавлено (16.05.2012, 12:41:41) --------------------------------------------- _WS_ вот так дает игроку денег [/code] SetEntProp(client, Prop_Send, "m_iAccount", 2000, 100); Code но когда даешь так, то стандартные деньги например у игрока было 8000 удаляются, и дается 2000.. так как можно добавить в 8000+2000(возможно ли это). Может как то получить его деньги и прибавить ему +2000 а затем дать игроку прибавленные деньги командой: SetEntProp(client, Prop_Send, "m_iAccount", cash, 100); [code] знал бы я как получить хотя бы его деньги...Добавлено (16.05.2012, 12:43:25) --------------------------------------------- блин ничайно удалил [code] и я почему то немогу редактировать
|
|
| |
_wS_
|
Дата: Среда, 16.05.2012, 17:09:26 | Сообщение # 14 |
|
Хм, GetEntProp - получить, SetEntProp - установить:
Code new cash = GetEntProp(client, Prop_Send, "m_iAccount") + 2000; if (cash > 16000) cash = 16000; SetEntProp(client, Prop_Send, "m_iAccount", cash);
|
|
| |
Scarface_slv
|
Дата: Суббота, 19.05.2012, 12:00:12 | Сообщение # 15 |
|
Сообщений: 737
Репутация: 61 [ +/- ]
|
|
Спасибо))Добавлено (19.05.2012, 12:00:12) --------------------------------------------- _WS_ возможно этот таймер повторяющимся сделать?
|
|
| |
|