Pysk Posted March 18, 2020 Group: Members Topic Count: 75 Topics Per Day: 0.02 Content Count: 234 Reputation: 8 Joined: 01/19/12 Last Seen: April 20, 2020 Share Posted March 18, 2020 Guten Tag zusammen. Ich habe auf meinem Server ein Script laufen welches jede Stunde einem Spieler ein Item gibt, was er für eine Stunde nutzen kann. Dannach wird wieder neu ausgelost. Nun ist das Problem das Spieler die AFK sind und auch GMs das Item ebenfalls bekommen können. Ich habe nun einige Versuche gemacht die AFK Spieler und GMs auszuschließen. Leider führ das immer dazu, das zur vollen Stunde das Item gar keiner mehr bekommt. Shops werden schön umgangen, das geht! Kann mir das jemand umbauen das beide Sachen ausgeschlossen werden? Wenn ein Spieler länger als ca. 15 Minuten AFK ist, sollte der das Item nicht bekommen. Und GMs ab Gruppe 10 sollten es auch nicht bekommen. VIP System ist an, daher müssen Spieler mit Gruppe 5 das Item auch bekommen können. while(1) { query_sql "select account_id from `char` where online = 1 order by rand() limit 1", .@aid; attachrid .@aid; if(CheckVending()) { DetachRID(); continue; } announce strcharinfo(0) +" gewinnt das Lucky Pick Event.", 0; rentitem 35002,3600; break; } end; } Quote Link to comment Share on other sites More sharing options...
Chaos92 Posted March 18, 2020 Group: Members Topic Count: 49 Topics Per Day: 0.01 Content Count: 1826 Reputation: 288 Joined: 08/03/12 Last Seen: 3 hours ago Share Posted March 18, 2020 if ( checkidle() >= 900 ) { } Quote Link to comment Share on other sites More sharing options...
Pysk Posted March 19, 2020 Group: Members Topic Count: 75 Topics Per Day: 0.02 Content Count: 234 Reputation: 8 Joined: 01/19/12 Last Seen: April 20, 2020 Author Share Posted March 19, 2020 Das habe ich bereits ins verschiedenen Variationen versucht einzubinden, aber immer klappt es nicht. Der Server erkennt keinen der Spieler als AFK. Entweder baue ich es an der falschen Stelle ein, oder es fehlt was. Quote Link to comment Share on other sites More sharing options...
Normynator Posted March 19, 2020 Group: Developer Topic Count: 7 Topics Per Day: 0.00 Content Count: 292 Reputation: 199 Joined: 05/03/13 Last Seen: May 26, 2023 Share Posted March 19, 2020 checkidle hätte ich jetzt auch vorgeschlagen. Für das GM Level: getgmlevel oder getgroupid Quote Link to comment Share on other sites More sharing options...
Pysk Posted March 19, 2020 Group: Members Topic Count: 75 Topics Per Day: 0.02 Content Count: 234 Reputation: 8 Joined: 01/19/12 Last Seen: April 20, 2020 Author Share Posted March 19, 2020 Ja ich weis, aber das Problem ist das egal wo ich es einbaue es einfach nicht angenommen wird. Warum weis ich nicht, ich vermute mal das ich es an der falschen stelle einsetze. Deswegen ja die Frage ob es jemand so umschreiben kann, das ich es nur einbauen muss. Quote Link to comment Share on other sites More sharing options...
Everade Posted June 1, 2020 Group: Members Topic Count: 19 Topics Per Day: 0.00 Content Count: 192 Reputation: 43 Joined: 12/13/11 Last Seen: April 9, 2023 Share Posted June 1, 2020 (edited) Wäre halt schön deine bisherigen Versuche anzusehen anstatt direkt zu verlangen das jemand dir die Arbeit abnimmt. In deinem script ist kein Timer, du prüfst lediglich für das vending. Dein aktuelles script scaled nicht wirklich gut wenn du einmal mehr Spieler hast. Da fängst du an deine SQL Datenbank mit grösseren Abfragen konstant zu penetrieren. (Der char table wird in der Regel sehr schnell sehr gross) Ich würde vorschlagen einen Timer an jeden Spieler zu attachen sobald man einloggt, und diesen auch sauber wieder zu entfernen. Die meisten Login Reward Scripts basieren ja eigentlich genau auf diesem Prinzip, und von denen gibt es wirklich mehr als genug. Da kannst du dann sowas machen wie zB: - script LOGIN -1,{ OnPCLogoutEvent: deltimer strnpcinfo(0)+"::OnTimer"; OnPCLoginEvent: .@i = (gettime(DT_YEAR) * 365 * 24 * 60) + (gettime(DT_DAYOFYEAR) * 24 * 60) + (gettime(DT_HOUR) * 60) +gettime(DT_MINUTE); .@t = .Rest - #DRewardTimer; .@state = checkvending(); if (.@i >= (#LastReward + .MinWait)) { addtimer 60000,strnpcinfo(0)+"::OnTimer"; end; OnTimer: if ( #DRewardTimer < .Rest ) { if (!(checkidle() >= 600) && (!(.@state&1) || !(.@state&2) || !(.@state&4)) && isloggedin(getcharid(3))) { #DRewardTimer++; } addtimer 60000,strnpcinfo(0)+"::OnTimer"; end; } } else { .@mins = (#LastReward + .MinWait - .@i)%60; message strcharinfo(0),"[Reward Test]: You have "+ ((.@mins) ? .@mins +" Minutes " : "") +"till your next reward."; addtimer (.@mins * 60000),strnpcinfo(0)+"::OnTimer"; end; } Claim: getitembound 512, 1, Bound_Account; #LastReward = .@i; #DRewardClaim = 0; #DRewardTimer = 0; message strcharinfo(0),"[Reward Test]: You have collected your 15min reward."; .@mins = (#LastReward + .MinWait - .@i)%60; addtimer (.@mins * 60000),strnpcinfo(0)+"::OnTimer"; } end; OnInit: // Minimum minutes between collecting reward .MinWait = 15; // Number of mins after logging before collecting prize .Rest = 15; end; } Wichtig: Ich habs nicht getestet und wird daher auch nicht funktional sein. Aber ich hoffe es gibt dir eine Idee wie du es hoffentlich lösen kannst. Das basiert auf einem Login Reward system, das heisst es pickt nicht einen einzelnen Spieler, sondern es läuft auf allen online charakter. Könntest du aber entsprechend modifizieren. Will auch nicht behaupten das es die beste Lösung ist, aber sicherlich besser als direkte SQL char table Abfragen. Zumindest meine Meinung. Edited June 1, 2020 by Everade Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.