Chumi Opublikowano Lipiec 23, 2020 o 07:18 Udostępnij Opublikowano Lipiec 23, 2020 o 07:18 Siemka, ostatnio miałem chęć dodania pluginu ADEPT_KPN na serwer, jednak napotkałem jeden problem. Jeżeli ktoś da kilka sekund przed końcem mapy prośbę o zagranie w KPN, to kredyty giną. Czy jest jakaś możliwość, aby nie można było użyć tej komendy przez 2 minuty przed końcem mapy? W załączniku daję sp pluginu. Spoiler #include <store> #include <clientprefs> #pragma semicolon 1 #pragma newdecls required #define MOD_TAG "\x01\x0B\x0E★ \x07[ADEPT-Kamień, Papier, Nożyce]\x04 " Handle g_hAllowInvite; bool g_bInGame[MAXPLAYERS + 1], Selected[MAXPLAYERS + 1], g_bAllowInvites[MAXPLAYERS + 1]; int g_iBetAmount[MAXPLAYERS + 1], g_iOponent[MAXPLAYERS + 1]; enum KPN { None = 0, Kamien, Papier, Nozyce, }; KPN kpn[MAXPLAYERS + 1]; public Plugin myinfo = { name = "ADEPT --> Kamień papier nożyce", description = "Autorski Plugin StudioADEPT.net", author = "Brum Brum", version = "1.0", url = "http://www.StudioADEPT.net/forum", }; public void OnPluginStart() { g_hAllowInvite = RegClientCookie("sm_kpn_allowinvite", "Zezwala/Nie zezwala na zaproszenia do KPN", CookieAccess_Protected); RegConsoleCmd("sm_kpn", CMD_KPN); } public void OnClientCookiesCached(int client) { char Value[11]; GetClientCookie(client, g_hAllowInvite, Value, sizeof(Value)); g_bAllowInvites[client] = StringToInt(Value); } public void OnClientDisconnect(int client) { if (g_bInGame[client]) { int client2 = GetClientOfUserId(g_iOponent[client]); Store_SetClientCredits(client2, Store_GetClientCredits(client) + g_iBetAmount[client]); Store_SetClientCredits(client, Store_GetClientCredits(client) - g_iBetAmount[client]); PrintToChat(client2, "%s Twój przeciwnik wyszedł z gry! Wygrałeś jego \x02%d kredytów", MOD_TAG, g_iBetAmount[client]); ResetAllVariables(client2); } if (AreClientCookiesCached(client)) { char Value[11]; Format(Value, sizeof(Value), "%d", g_bAllowInvites[client]); SetClientCookie(client, g_hAllowInvite, Value); } ResetAllVariables(client); g_bAllowInvites[client] = true; } public Action CMD_KPN(int client, int args) { if (g_bInGame[client]) { PrintToChat(client, "%s Nie możesz wyzwać innego gracze w trakcie gry!", MOD_TAG); return Plugin_Handled; } if (args == 0) { OpenKPNMenu(client); return Plugin_Handled; } if (args < 2) { ReplyToCommand(client, "%s Użyj !kpn <nick> <suma>", MOD_TAG); return Plugin_Handled; } if (args > 2) { ReplyToCommand(client, "%s Użyj !kpn <nick> <suma>", MOD_TAG); return Plugin_Handled; } char arg[65], arg2[11]; GetCmdArg(1, arg, sizeof(arg)); GetCmdArg(2, arg2, sizeof(arg2)); int count = StringToInt(arg2); if (count > Store_GetClientCredits(client)) { PrintToChat(client, "%s Nie masz wystarczająco kredytów!", MOD_TAG); return Plugin_Handled; } if (count <= 0) { PrintToChat(client, "%s Kwota musi być większa od zera!", MOD_TAG); return Plugin_Handled; } int target = FindTarget(client, arg, false, false); if (target == -1) { return Plugin_Handled; } if (target == client) { PrintToChat(client, "%s Nie możesz wyzwać samego siebie XD", MOD_TAG); return Plugin_Handled; } if (!g_bAllowInvites[target]) { PrintToChat(client, "%s Wskazany gracz nie akceptuje zaproszeń!", MOD_TAG); return Plugin_Handled; } if (g_bInGame[target]) { PrintToChat(client, "%s Nie możesz wyzwać innego gracze w trakcie jego gry!", MOD_TAG); return Plugin_Handled; } if (count > Store_GetClientCredits(target)) { PrintToChat(client, "%s Osoba z którą chcesz grać nie ma tyle pieniędzy!", MOD_TAG); return Plugin_Handled; } KPN_Invite(client, target, count); return Plugin_Handled; } public void KPN_Invite(int client, int target, int count) { char title[256], option[32]; Menu menu = new Menu(Menu_Handler); Format(title, sizeof(title), "ADEPT -> Kamień, Papier, Nożyce\n%N wyzwał Ciebie na pojedynek w Kamień, Papier, Nożyce\nZawalczycie o %d kredytów", client, count); menu.SetTitle(title); Format(option, sizeof(option), "yes;%d;%d", GetClientUserId(client), count); menu.AddItem(option, "Akceptuję"); Format(option, sizeof(option), "no;%d;%d", GetClientUserId(client), count); menu.AddItem(option, "Rezygnuję"); menu.ExitButton = true; menu.Display(target, 15); } public int Menu_Handler(Menu menu, MenuAction action, int client, int item) { if (!IsValidClient(client))return; switch (action) { case MenuAction_Select: { char info[128], TempArray[3][128]; menu.GetItem(item, info, sizeof(info)); ExplodeString(info, ";", TempArray, 3, sizeof(TempArray[])); int sender = GetClientOfUserId(StringToInt(TempArray[1])); int count = StringToInt(TempArray[2]); if (StrEqual(TempArray[0], "yes")) { g_iBetAmount[client] = count; g_iBetAmount[sender] = count; g_bInGame[client] = true; g_bInGame[sender] = true; g_iOponent[client] = GetClientUserId(sender); g_iOponent[sender] = GetClientUserId(client); StartKPN(client); StartKPN(sender); } else { PrintToChat(sender, "%s \x02%N\x04 odrzucił twoją propozycję gry!", MOD_TAG, client); } } case MenuAction_End:delete menu; } } void StartKPN(int client) { if (!IsValidClient(client))return; Menu menu = new Menu(KPN_Handler); menu.SetTitle("ADEPT -> Co chcesz wystawić"); menu.AddItem("", "Kamień"); menu.AddItem("", "Papier"); menu.AddItem("", "Nożyce"); menu.ExitButton = false; menu.Display(client, MENU_TIME_FOREVER); } public int KPN_Handler(Menu menu, MenuAction action, int client, int item) { if (!IsValidClient(client))return; if (action == MenuAction_Select) { switch (item) { case 0:kpn[client] = Kamien; case 1:kpn[client] = Papier; case 2:kpn[client] = Nozyce; } CheckGame(client); } else if (action == MenuAction_End)delete menu; } void CheckGame(int client) { int client2 = GetClientOfUserId(g_iOponent[client]); //REMISY if (kpn[client] == Kamien && kpn[client2] == Kamien) { EndGame(true, client, client2); } if (kpn[client] == Papier && kpn[client2] == Papier) { EndGame(true, client, client2); } if (kpn[client] == Nozyce && kpn[client2] == Nozyce) { EndGame(true, client, client2); } //WYGRANE C1 if (kpn[client] == Kamien && kpn[client2] == Nozyce) { EndGame(false, client, client2); } if (kpn[client] == Papier && kpn[client2] == Kamien) { EndGame(false, client, client2); } if (kpn[client] == Nozyce && kpn[client2] == Papier) { EndGame(false, client, client2); } //WYGRANE C2 if (kpn[client] == Nozyce && kpn[client2] == Kamien) { EndGame(false, client2, client); } if (kpn[client] == Kamien && kpn[client2] == Papier) { EndGame(false, client2, client); } if (kpn[client] == Papier && kpn[client2] == Nozyce) { EndGame(false, client2, client); } } void EndGame(bool remis, int winner, int looser) { char KPNStringWinner[16], KPNStringLooser[16]; switch (kpn[winner]) { case Kamien:Format(KPNStringWinner, sizeof(KPNStringWinner), "Kamień"); case Papier:Format(KPNStringWinner, sizeof(KPNStringWinner), "Papier"); case Nozyce:Format(KPNStringWinner, sizeof(KPNStringWinner), "Nożyce"); } switch (kpn[looser]) { case Kamien:Format(KPNStringLooser, sizeof(KPNStringLooser), "Kamień"); case Papier:Format(KPNStringLooser, sizeof(KPNStringLooser), "Papier"); case Nozyce:Format(KPNStringLooser, sizeof(KPNStringLooser), "Nożyce"); } if (remis) { PrintToChat(winner, "%s \x02REMIS\x04 Gracz \x02%N\x04 postawił \x02%s", MOD_TAG, looser, KPNStringLooser); PrintToChat(looser, "%s \x02REMIS\x04 Gracz \x02%N\x04 postawił \x02%s", MOD_TAG, winner, KPNStringWinner); ResetAllVariables(winner); ResetAllVariables(looser); return; } else { Store_SetClientCredits(winner, Store_GetClientCredits(winner) + g_iBetAmount[winner]); Store_SetClientCredits(looser, Store_GetClientCredits(looser) - g_iBetAmount[winner]); PrintToChat(winner, "%s Wygrałeś \x02%d kredytów\x04 Twój przeciwnik postawił \x02%s", MOD_TAG, g_iBetAmount[winner], KPNStringLooser); PrintToChat(looser, "%s Przegrałeś \x02%d kredytów\x04 Twój przeciwnik postawił \x02%s", MOD_TAG, g_iBetAmount[winner], KPNStringWinner); ResetAllVariables(winner); ResetAllVariables(looser); return; } } void OpenKPNMenu(int client) { Menu menu = new Menu(KPN_Menu); menu.SetTitle("ADEPT -> Kamień Papier Nożyce"); menu.AddItem("", "Ustawienia"); menu.ExitButton = true; menu.Display(client, 60); } public int KPN_Menu(Menu menu, MenuAction action, int client, int item) { if (!IsValidClient(client))return; switch (action) { case MenuAction_Select: { switch (item) { case 0: { Menu nmenu = new Menu(KPNSetting_Handler); nmenu.AddItem("", "Zezwalaj na zaproszenia do gry"); nmenu.AddItem("", "Odrzucaj zaproszenia do gry"); nmenu.ExitButton = true; nmenu.Display(client, 30); } } } case MenuAction_End:delete menu; } } public int KPNSetting_Handler(Menu menu, MenuAction action, int client, int item) { if (!IsValidClient(client))return; switch (action) { case MenuAction_Select: { switch (item) { case 0: { g_bAllowInvites[client] = true; PrintToChat(client, "%s Zezwalasz na zaproszenia do gry w KPN!", MOD_TAG); } case 1: { g_bAllowInvites[client] = false; PrintToChat(client, "%s Nie zezwalasz na zaproszenia do gry w KPN!", MOD_TAG); } } } } } void ResetAllVariables(int client) { g_iBetAmount[client] = -1; g_bInGame[client] = false; g_iOponent[client] = -1; kpn[client] = None; Selected[client] = false; } public bool IsValidClient(int client) { if (!(1 <= client <= MaxClients) || !IsClientInGame(client) || !IsClientConnected(client) || IsFakeClient(client) || IsClientSourceTV(client)) return false; return true; } ADEPT_KPN.sp Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto
Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.
Zarejestruj nowe konto
Załóż nowe konto. To bardzo proste!
Zarejestruj sięZaloguj się
Posiadasz już konto? Zaloguj się poniżej.
Zaloguj się