Помогите с таймером чтобы выбирал игрока
|
|
PlaN4ik
|
Дата: Четверг, 08.05.2014, 19:23:10 | Сообщение # 1 |
|
Сообщений: 33
Репутация: -7 [ +/- ]
|
|
Помогите доделать код. Нужно чтобы по истечению времени таймера выбирался 1 игрок и ему давались кредиты в shop
Код new Handle:mytimer[MAXPLAYERS+1];
public OnClientPutInServer(client) { if(client > 0 && !IsFakeClient(client)) { mytimer[client] = CreateTimer(60.0, command, client); } }
public OnClientDisconnect(client) { if (mytimer[client] != INVALID_HANDLE) { KillTimer(mytimer[client]); mytimer[client] = INVALID_HANDLE; } }
public Action:command(Handle:timer, any:client) { decl String:szName[64]; GetClientName(client, szName, sizeof(szName)); ServerCommand("shop_credits \"%s\" 1", szName); mytimer[client] = CreateTimer(60.0, command, client); }
Здесь выдаётся каждому а нужно чтобы выбирался один игрок.
|
|
| |
«SeReGa»☆
|
Дата: Четверг, 08.05.2014, 19:49:21 | Сообщение # 2 |
|
Сообщений: 395
Репутация: 37 [ +/- ]
|
|
Код new Handle:mytimer[MAXPLAYERS+1];
public OnClientPutInServer(client) { new String:persona[64]; GetClientAuthString(client, persona, sizeof(persona)); if (StrEqual(persona, "STEAM_0:1:********")) // здесь пропиши SPEAM того одного человека { if(client > 0 && !IsFakeClient(client)) { mytimer[client] = CreateTimer(60.0, command, client); } } }
public OnClientDisconnect(client) { if (mytimer[client] != INVALID_HANDLE) { KillTimer(mytimer[client]); mytimer[client] = INVALID_HANDLE; } }
public Action:command(Handle:timer, any:client) { decl String:szName[64]; GetClientName(client, szName, sizeof(szName)); ServerCommand("shop_credits \"%s\" 1", szName); mytimer[client] = CreateTimer(60.0, command, client); }
Сообщение отредактировал «SeReGa»☆ - Четверг, 08.05.2014, 19:52:45 |
|
| |
PlaN4ik
|
Дата: Четверг, 08.05.2014, 19:51:49 | Сообщение # 3 |
|
Сообщений: 33
Репутация: -7 [ +/- ]
|
|
Цитата «SeReGa»☆ ( ) new Handle:mytimer[MAXPLAYERS+1]; public OnClientPutInServer(client) { new String:persona[64]; GetClientAuthString(client, persona, sizeof(persona)); // Берешь Стим айди игрока if (StrEqual(persona, "STEAM_0:1:********")) // Если он равен написанному, то { if(client > 0 && !IsFakeClient(client)) { mytimer[client] = CreateTimer(60.0, command, client); } } } public OnClientDisconnect(client) { if (mytimer[client] != INVALID_HANDLE) { KillTimer(mytimer[client]); mytimer[client] = INVALID_HANDLE; } } public Action:command(Handle:timer, any:client) { decl String:szName[64]; GetClientName(client, szName, sizeof(szName)); ServerCommand("shop_credits \"%s\" 1", szName); mytimer[client] = CreateTimer(60.0, command, client); } Спасибо, но это не то) Мне нужно чтобы выбирался 1 игрок из играющих на сервере рандомно и ему выдавались кредиты и так происходило каждый раз когда срабатывал таймер.
|
|
| |
«SeReGa»☆
|
Дата: Четверг, 08.05.2014, 19:53:46 | Сообщение # 4 |
|
Сообщений: 395
Репутация: 37 [ +/- ]
|
|
каждый раз случайный человек?? точнее каждых 60 сек?
Сообщение отредактировал «SeReGa»☆ - Четверг, 08.05.2014, 19:54:44 |
|
| |
PlaN4ik
|
Дата: Четверг, 08.05.2014, 19:54:40 | Сообщение # 5 |
|
Сообщений: 33
Репутация: -7 [ +/- ]
|
|
Да мне для минигейма нужно.
|
|
| |
«SeReGa»☆
|
Дата: Четверг, 08.05.2014, 20:01:34 | Сообщение # 6 |
|
Сообщений: 395
Репутация: 37 [ +/- ]
|
|
Код new Handle:mytimer[MAXPLAYERS+1];
public OnClientPutInServer(client) { new target = GetRandomClient();
mytimer[target] = CreateTimer(60.0, command, target); }
public OnClientDisconnect(target) { if (mytimer[target] != INVALID_HANDLE) { KillTimer(mytimer[target]); mytimer[target] = INVALID_HANDLE; } }
public Action:command(Handle:timer, any:target) { decl String:szName[64]; GetClientName(target, szName, sizeof(szName)); ServerCommand("shop_credits \"%s\" 1", szName); mytimer[target] = CreateTimer(60.0, command, target); }
GetRandomClient(bool:no_bot = true, bool:alive = false, team = 0) { new num = 0, players[MaxClients]; for (new i = 1; i <= MaxClients; i++) { if (!IsClientInGame(i) || (no_bot && IsFakeClient(i))) continue; if ((alive && !IsPlayerAlive(i)) || (0 < team < 4 && GetClientTeam(i) != team)) continue; players[num++] = i; } if (num > 0) return players[GetRandomInt(0, num - 1)]; return -1; }
Попробуй
|
|
| |
PlaN4ik
|
Дата: Четверг, 08.05.2014, 20:14:39 | Сообщение # 7 |
|
Сообщений: 33
Репутация: -7 [ +/- ]
|
|
Все кластно, но он выдает сразу по 5-6 раз кредиты игроку.
|
|
| |
|
Naykon
|
Дата: Пятница, 09.05.2014, 01:04:33 | Сообщение # 9 |
|
Сообщений: 439
Репутация: -4 [ +/- ]
|
|
Для того что бы ты понял что делает твой код из 1 поста. После того как игрок подключился создается таймер на 60 сек и по окончанию выдает кредиты и сразу же создается новый таймер опять же на 60 секунд и снова по окончанию выдаются кредиты... получается таймер работает рекурсивно. Как буду дома отпишу код который каждые 60 секунд выдает 1 рандомному игршку кредиты... автор я верно тебя понял?
|
|
| |
PlaN4ik
|
Дата: Пятница, 09.05.2014, 11:05:39 | Сообщение # 10 |
|
Сообщений: 33
Репутация: -7 [ +/- ]
|
|
Да да буду очень благодарен :))
|
|
| |
Naykon
|
Дата: Пятница, 09.05.2014, 14:08:23 | Сообщение # 11 |
|
Сообщений: 439
Репутация: -4 [ +/- ]
|
|
Код #include <sourcemod>
public OnMapStart() { CreateTimer(60.0, Timer_Func, _, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE); }
public Action:Timer_Func(Handle:timer) { decl String:szName[64]; GetClientName(GetRandomClient(), szName, sizeof(szName)); ServerCommand("shop_credits \"%s\" 1", szName); }
GetRandomClient() { new indexes[MaxClients+1], players = 0; for (new i = 1; i <= MaxClients; i++) { if (IsClientInGame(i)) { indexes[players++] = i; } } if (players > 0) return indexes[GetRandomInt(0, players-1)]; return 0; }
|
|
| |