-Gamer- Napisano 6 Sierpnia 2018 Witam, Tak jak w temacie chciałbym dodać do pluginu ograniczenie używania komendy np co 2 rundy to jest około 60sek ponieważ 1 arenka trwa 30sek Plugin do którego chciałbym dodać ograniczenie używania komendy: https://github.com/KewaiiGamer/Store-RouletteHej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami! Tutaj mam już gotowy kod ale gdy dodaję go do pluginu przy kompilacji wyrzuca mi błąd Spoiler float OstatnieUzycie[MAXPLAYERS + 1]; ConVar delay; public void OnPluginStart() { RegConsoleCmd("sm_czesc", test123); delay = CreateConVar("delay", "30", "Cos sada"); } public void OnClientPutInServer(int client) { OstatnieUzycie[client] = GetGameTime(); } public Action test123 (int client, int args) { if(OstatnieUzycie[client] + GetConVarFloat(delay) > GetGameTime()) { ReplyToCommand(client, "Musisz odczekac 30 sekund, przed ponownym użyciem tej komendy!"); /// %s czasu jaki pozostal przed uzyciem ponownie komendy RoundFloat((OstatnieUzycie[client] + RoundFloat(GetConVarFloat(delay))) - RoundFloat(GetGameTime()))); return Plugin_Handled; } /// Tutaj Twoj KOD return Plugin_Continue; } Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Vasto_Lorde Napisano 6 Sierpnia 2018 Hej! Kod wygląda w miarę dobrze, podrzuć jeszcze zmodyfikowany plugin do którego to wstawiłeś i będziemy mogli spojrzeć na te errory ? Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
-Gamer- Napisano 6 Sierpnia 2018 (edytowane) Spoiler #pragma semicolon 1 #include <csgocolors> #include <store> #pragma newdecls required float OstatnieUzycie[MAXPLAYERS + 1]; int ScrollTimes[MAXPLAYERS + 1]; int WinNumber[MAXPLAYERS + 1]; int betAmount[MAXPLAYERS + 1]; bool isSpinning[MAXPLAYERS + 1] = false; ConVar delay; ConVar g_Cvar_NormalItems; ConVar g_Cvar_VIPItems; ConVar g_Cvar_VIPFlag; char g_sNormalItems[64]; char g_sVIPItems[64]; #define PLUGIN_NAME "Store Roulette by Kewaii" #define PLUGIN_AUTHOR "Kewaii" #define PLUGIN_DESCRIPTION "Zephyrus Store Roulette" #define PLUGIN_VERSION "1.3.9" #define PLUGIN_TAG "{pink}[Roulette by Kewaii]{green}" public Plugin myinfo = { name = PLUGIN_NAME, author = PLUGIN_AUTHOR, description = PLUGIN_DESCRIPTION, version = PLUGIN_VERSION, url = "http://steamcommunity.com/id/KewaiiGamer" }; public void OnPluginStart() { g_Cvar_VIPFlag = CreateConVar("kewaii_roulette_vip_flag", "a", "VIP Access Flag"); g_Cvar_NormalItems = CreateConVar("kewaii_roulette_normal_items", "50,100,250,500", "Lists all the menu items for normal player roulette. Separate each item with a comma. Only integers allowed"); g_Cvar_VIPItems = CreateConVar("kewaii_roulette_vip_items", "1000,2500,5000,10000", "Lists all the menu items for VIP player roulette. Separate each item with a comma. Only integers allowed"); RegConsoleCmd("sm_ruletka", CommandRoulette); delay = CreateConVar("delay", "30", "Ostatnie"); LoadTranslations("kewaii_roulette.phrases"); AutoExecConfig(true, "kewaii_roulette"); } public void OnClientPostAdminCheck(int client) { isSpinning[client] = false; } public void OnClientPutInServer(int client) { Ostatnie[client] = GetGameTime(); } public Action CommandRoulette(int client, int args) { if(OstatnieUzycie[client] + GetConVarFloat(delay) > GetGameTime()) { ReplyToCommand(client, "Musisz odczekac 30 sekund, przed ponownym użyciem tej komendy!"); /// %s czasu jaki pozostal przed uzyciem ponownie komendy RoundFloat((OstatnieUzycie[client] + RoundFloat(GetConVarFloat(delay))) - RoundFloat(GetGameTime()))); return Plugin_Handled; } if (client > 0 && args < 1) { CreateRouletteMenu(client).Display(client, 10); } return Plugin_Handled; } Menu CreateRouletteMenu(int client) { Menu menu = new Menu(RouletteMenuHandler); char buffer[128]; Format(buffer, sizeof(buffer), "%T", "ChooseType", client); menu.SetTitle(buffer); menu.AddItem("player", "Player"); menu.AddItem("vip", "VIP", !HasClientVIP(client) ? ITEMDRAW_DISABLED : ITEMDRAW_DEFAULT); return menu; } public int RouletteMenuHandler(Menu menu, MenuAction action, int client, int selection) { switch(action) { case MenuAction_Select: { if(IsClientInGame(client)) { char option[32]; menu.GetItem(selection, option, sizeof(option)); if (StrEqual(option, "player")) { CreatePlayerRouletteMenu(client).Display(client, MENU_TIME_FOREVER); } if (StrEqual(option, "vip")) { CreateVIPRouletteMenu(client).Display(client, MENU_TIME_FOREVER); } } } case MenuAction_End: { delete menu; } } } Menu CreatePlayerRouletteMenu(int client) { Menu menu = new Menu(CreditsChosenMenuHandler); char buffer[128]; Format(buffer, sizeof(buffer), "%T", "ChooseCredits", client, Store_GetClientCredits(client)); menu.SetTitle(buffer); GetConVarString(g_Cvar_NormalItems, g_sNormalItems, sizeof(g_sNormalItems)); char sItems[18][16]; ExplodeString(g_sNormalItems, ",", sItems, sizeof(sItems), sizeof(sItems[])); for (int i = 0; i < sizeof(sItems); i++) { if (!StrEqual(sItems[i], "")) { menu.AddItem(sItems[i], sItems[i], Store_GetClientCredits(client) >= StringToInt(sItems[i]) ? ITEMDRAW_DEFAULT : ITEMDRAW_DISABLED); } } menu.ExitBackButton = true; return menu; } Menu CreateVIPRouletteMenu(int client) { Menu menu = new Menu(CreditsChosenMenuHandler); char buffer[128]; Format(buffer, sizeof(buffer), "%T", "ChooseCredits", client, Store_GetClientCredits(client)); menu.SetTitle(buffer); GetConVarString(g_Cvar_VIPItems, g_sVIPItems, sizeof(g_sVIPItems)); char sItems[18][16]; ExplodeString(g_sVIPItems, ",", sItems, sizeof(sItems), sizeof(sItems[])); for (int i = 0; i < sizeof(sItems); i++) { if (!StrEqual(sItems[i], "")) { menu.AddItem(sItems[i], sItems[i], Store_GetClientCredits(client) >= StringToInt(sItems[i]) ? ITEMDRAW_DEFAULT : ITEMDRAW_DISABLED); } } menu.ExitBackButton = true; return menu; } public int CreditsChosenMenuHandler(Menu menu, MenuAction action, int client, int selection) { switch(action) { case MenuAction_Select: { if(IsClientInGame(client)) { char option[32]; menu.GetItem(selection, option, sizeof(option)); int crd = Store_GetClientCredits(client); int bet = StringToInt(option); if(crd >= bet) { if (!isSpinning[client]) { Store_SetClientCredits(client, crd - bet); betAmount[client] = bet; SpinCredits(client); isSpinning[client] = true; } else { CPrintToChat(client, "%s %t", PLUGIN_TAG, "AlreadySpinning"); } } else { CPrintToChat(client, "%s %t", PLUGIN_TAG, "NoEnoughCredits", bet - crd); } } } case MenuAction_Cancel: { if (IsClientInGame(client) && selection == MenuCancel_ExitBack) { CreateRouletteMenu(client).Display(client, 10); } } case MenuAction_End: { delete menu; } } } public void SpinCredits(int client) { int FakeNumber = GetRandomInt(0,999); PrintHintText(client, "<font color='#ff0000'>[Credits Roulette]</font><font color='#00ff00'> Number:</font><font color='#0000ff'> %i", FakeNumber); if(ScrollTimes[client] == 0) { ClientCommand(client, "playgamesound *ui/csgo_ui_crate_open.wav"); } if(ScrollTimes[client] < 20) { CreateTimer(0.05, TimerNext, client); ScrollTimes[client] += 1; ClientCommand(client, "playgamesound *ui/csgo_ui_crate_item_scroll.wav"); } else if(ScrollTimes[client] < 30) { float AddSomeTime = 0.05 * ScrollTimes[client] / 3; CreateTimer(AddSomeTime, TimerNext, client); ScrollTimes[client] += 1; ClientCommand(client, "playgamesound *ui/csgo_ui_crate_item_scroll.wav"); } else if(ScrollTimes[client] == 30) { int troll = GetRandomInt(1,2); if(troll == 1) { ClientCommand(client, "playgamesound *ui/csgo_ui_crate_item_scroll.wav"); ScrollTimes[client] += 1; CreateTimer(1.5, TimerNext, client); } else { ClientCommand(client, "playgamesound *ui/csgo_ui_crate_item_scroll.wav"); CreateTimer(1.5, TimerFinishing, client); WinNumber[client] = FakeNumber; ScrollTimes[client] = 0; } } else { ClientCommand(client, "playgamesound *ui/csgo_ui_crate_item_scroll.wav"); CreateTimer(1.5, TimerFinishing, client); WinNumber[client] = FakeNumber; ScrollTimes[client] = 0; } } public Action TimerFinishing(Handle timer, any client) { if (IsClientInGame(client)) { isSpinning[client] = false; WinCredits(client, WinNumber[client], betAmount[client]); } } public void WinCredits(int client, int Number, int Bet) { if(IsClientInGame(client)) { CPrintToChatAll("%s %t", PLUGIN_TAG, "WinNumber", client, Number); int multiplier; if(Number == 0) { multiplier = 25; ClientCommand(client, "playgamesound *ui/item_drop6_ancient.wav"); } else if(Number > 0 && Number < 500) { multiplier = -1; ClientCommand(client, "playgamesound music/skog_01/lostround.mp3"); CPrintToChatAll("%s %t", PLUGIN_TAG, "YouLost", client, Bet); } else if(Number >= 500 && Number < 600) { multiplier = 0; ClientCommand(client, "playgamesound *ui/item_drop1_common.wav"); CPrintToChatAll("%s %t", PLUGIN_TAG, "NoLoseNoWin", client); } else if(Number >= 600 && Number < 750) { multiplier = 1; ClientCommand(client, "playgamesound *ui/item_drop2_uncommon.wav"); } else if(Number >= 750 && Number < 850) { multiplier = 2; ClientCommand(client, "playgamesound *ui/item_drop2_uncommon.wav"); } else if(Number >= 850 && Number < 925) { multiplier = 3; ClientCommand(client, "playgamesound *ui/item_drop3_rare.wav"); } else if(Number >= 925 && Number < 965) { multiplier = 4; ClientCommand(client, "playgamesound *ui/item_drop3_rare.wav"); } else if(Number >= 965 && Number < 995) { multiplier = 5; ClientCommand(client, "playgamesound *ui/item_drop3_rare.wav"); } else if(Number >= 995 && Number < 997) { multiplier = 10; ClientCommand(client, "playgamesound *ui/item_drop3_rare.wav"); } else if(Number >= 997 && Number < 999) { multiplier = 15; ClientCommand(client, "playgamesound *ui/item_drop3_rare.wav"); } else if(Number == 999) { multiplier = 20; ClientCommand(client, "playgamesound *ui/item_drop6_ancient.wav"); } if (multiplier > 0) { CPrintToChatAll("%s %t", PLUGIN_TAG, "YouWin", client, Bet * multiplier, multiplier); Store_SetClientCredits(client, Store_GetClientCredits(client) + Bet * (multiplier + 1)); } } } public Action TimerNext(Handle timer, any client) { if (IsClientInGame(client)) { SpinCredits(client); } } public bool HasClientVIP(int client) { char ConVarValue[32]; GetConVarString(g_Cvar_VIPFlag, ConVarValue, sizeof(ConVarValue)); int flag = ReadFlagString(ConVarValue); return CheckCommandAccess(client, "", flag, true); } return Plugin_Continue; } A to błąd, który dostaje przy kompilacji kewaii_roulette.sp // // kewaii_roulette.sp(47) : error 076: syntax error in the expression, or invalid function call // kewaii_roulette.sp(47) : error 029: invalid expression, assumed zero // kewaii_roulette.sp(47) : error 029: invalid expression, assumed zero // kewaii_roulette.sp(47) : fatal error 189: too many error messages on one line // // Compilation aborted. // 4 Errors. Pewnie gdzieś coś w złe miejsce wstawiłem i dlatego jest problem ? Edytowane 6 Sierpnia 2018 przez -Gamer- Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Vasto_Lorde 1 Napisano 6 Sierpnia 2018 W tej linii znajduje się kod: public void OnClientPutInServer(int client) { Ostatnie[client] = GetGameTime(); } Który wygląda dobrze. Jednakże, "Ostatnie" nie jest nigdzie zdeklarowane pewnie chodziło o "OstatnieUzycie". Zmieniłem nazwę zmiennej, ale błąd nadal występował. Co dziwne, gdy przepisałem linijkę z błędem ręcznie, wszystko zaczęło śmigać. Jak widać na screenie, kompilator reaguje tylko na oryginalną linijkę, jednak na moją przepisaną nie. ? Śmieszna sytuacja. Zapewne jakiś niewidoczny znaczek się tam wkradł. Poza tym, na samym końcu kodu znajdują się 2 linijki które nie są do niczego potrzebne: return Plugin_Continue; } Po poprawieniu tych błędów wszystko śmiga. Załączam pliczek do ściągnięcia - ruletka.spHej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami! Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
-Gamer- Napisano 6 Sierpnia 2018 (edytowane) Kurcze plugin działa, ale blokada nie działa tak jak bym tego chciał ? Plugin blokuje komendę przez pierwsze 60sek po upływie 60sek można używać komendy do woli a ja chciałbym by można jej używać raz na 60sek czyli co 2 rund. Była by możliwość to poprawić ? @Vasto_Lorde Edytowane 6 Sierpnia 2018 przez -Gamer- Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Vasto_Lorde Napisano 6 Sierpnia 2018 Jak widzisz w danym kodzie, za aktualizacje kiedy ostatni raz gracz używał komendy odpowiada linia Ostatnie[client] = GetGameTime(); W Twoim kodzie, jest ona ustawiona tylko i wyłącznie przy połączeniu gracza z serwerem, czyli tu: public void OnClientPutInServer(int client) Więc jeśli będziesz aktualizował czas tylko wtedy kiedy gracz sukcesywnie użyje komendy, to komendę będzie można używać tylko co 60 sekund tak jak chcesz Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
-Gamer- Napisano 6 Sierpnia 2018 Niestety nie znam się na tym za bardzo nie wiem z czym to się je ? Kod ten, który podałem napisała go dla mnie inna osoba Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Vasto_Lorde 1 Napisano 6 Sierpnia 2018 To może postaram się wytłumaczyć. Funkcja, która odpowiada za użycie ruletki w twoim kodzie jest następująca: public Action CommandRoulette(int client, int args) { if(OstatnieUzycie[client] + GetConVarFloat(delay) > GetGameTime()) { ReplyToCommand(client, "Musisz odczekac 30 sekund, przed ponownym użyciem tej komendy!"); /// %s czasu jaki pozostal przed uzyciem ponownie komendy RoundFloat((OstatnieUzycie[client] + RoundFloat(GetConVarFloat(delay))) - RoundFloat(GetGameTime()))); return Plugin_Handled; } if (client > 0 && args < 1) { CreateRouletteMenu(client).Display(client, 10); } return Plugin_Handled; } W pierwszych liniach tej funkcji CommandRoulette jest sprawdzane czy gracz może użyć tej komendy, między innymi czy minęło twe 60 sekund od ostatniego użycia komendy. Nie jest to nam aktualnie do niczego potrzebne. Ważna jest linia: CreateRouletteMenu(client).Display(client, 10); To ona bezpośrednio wywołuje ruletkę. Także jeśli kod tej funkcji dojdzie do tego kawałka to znaczy, że ruletka poprawnie odpaliła się danemu graczowi. Teraz aby faktycznie komenda miała limit 60 sekund między użyciami, to tutaj musi być zaktualizowany czas kiedy gracz ostatnio użył tej komendy. Jak wspomniałem w ostatnim poście, za aktualizację kiedy ostatnio gracz użył komendy odpowiada ten kod: Ostatnie[client] = GetGameTime (); Więc wystarczy ten kod wpisać po bezpośrednim wywołaniu wywołaniu ruletki (czyli po CreateRouletteMenu(client).Display(client, 10); ) Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
-Gamer- Napisano 6 Sierpnia 2018 (edytowane) public Action CommandRoulette(int client, int args) { if(OstatnieUzycie[client] + GetConVarFloat(delay) > GetGameTime()) { ReplyToCommand(client, "Musisz odczekac %s sekund, przed ponownym użyciem tej komendy!"); /// %s czasu jaki pozostal przed uzyciem ponownie komendy RoundFloat((OstatnieUzycie[client] + RoundFloat(GetConVarFloat(delay))) - RoundFloat(GetGameTime()))); return Plugin_Handled; } if (client > 0 && args < 1) { CreateRouletteMenu(client).Display(client, 10); } { OstatnieUzycie[client] = GetGameTime(); } return Plugin_Handled; } Dodałem to w taki sposób, ale teraz blokuje tylko tak jak by raz czyli użyłem komendy następnie po następnej próbie blokuje ale jak biorę 3 raz to się odblokowuje od razu i nie wyświetla tego w ogóle: "Musisz odczekac 60 sekund, przed ponownym użyciem tej komendy!" Ogólnie ciężko mi idzie myślenie jak to działa ? Edytowane 6 Sierpnia 2018 przez -Gamer- Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Vasto_Lorde 2 Napisano 6 Sierpnia 2018 Poszło Ci dobrze. Perfekcyjnie wyglądałoby to tak: public Action CommandRoulette(int client, int args) { if(OstatnieUzycie[client] + GetConVarFloat(delay) > GetGameTime()) { ReplyToCommand(client, "Musisz odczekac 60 sekund, przed ponownym użyciem tej komendy!"); /// %s czasu jaki pozostal przed uzyciem ponownie komendy RoundFloat((OstatnieUzycie[client] + RoundFloat(GetConVarFloat(delay))) - RoundFloat(GetGameTime()))); return Plugin_Handled; } if (client > 0 && args < 1) { CreateRouletteMenu(client).Display(client, 10); OstatnieUzycie[client] = GetGameTime(); } return Plugin_Handled; } Niepotrzebnie wstawiłeś dodatkowe {, } do kodu ? Wszystko powinno być dobrze, jeśli nadal dzieje się tak jak napisałeś wyżej opisz dokładnie jak problem występuje i co ile używasz komendy Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
-Gamer- Napisano 6 Sierpnia 2018 Teraz blokada działa, ale i tak po 20sek się odblokowywuje sama a powinna po 60sek tutaj się zmienia ile ma trwać blokada ? delay = CreateConVar("delay", "60", "Ostatnie"); Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Vasto_Lorde 1 Napisano 6 Sierpnia 2018 Tak jest, ale poprawnie liczba 60 powinna być floatem, czyli zamiast 60 powinieneś tam wpisać 60.0 Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
-Gamer- Napisano 6 Sierpnia 2018 Dzięki wielkie można zamknąć. Przez Vasto_Lorde, 6 Sierpnia 2018 Temat rozwiązany ^^ Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach