Jump to content
Pysk

AFK & GM check bei Autoscript

Recommended Posts

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", [email protected];
  attachrid [email protected];
  if(CheckVending())
  {
   DetachRID();
   continue;
  }
  announce strcharinfo(0) +" gewinnt das Lucky Pick Event.", 0;
  rentitem 35002,3600;
  break;
}
end;
}
	

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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:
	[email protected]i = (gettime(DT_YEAR) * 365 * 24 * 60) + (gettime(DT_DAYOFYEAR) * 24 * 60) + (gettime(DT_HOUR) * 60) +gettime(DT_MINUTE);
	[email protected]t = .Rest - #DRewardTimer;
	[email protected]state = checkvending();

	if ([email protected]i >= (#LastReward + .MinWait)) {
			addtimer 60000,strnpcinfo(0)+"::OnTimer";
			end;
OnTimer:
		if ( #DRewardTimer < .Rest ) {
			if (!(checkidle() >= 600) && (!([email protected]state&1) || !([email protected]state&2) || !([email protected]state&4)) && isloggedin(getcharid(3))) {
				#DRewardTimer++;
			}
				addtimer 60000,strnpcinfo(0)+"::OnTimer";
				end;
		}
	} else {
		[email protected]mins = (#LastReward + .MinWait - [email protected]i)%60;
		message strcharinfo(0),"[Reward Test]: You have "+ (([email protected]mins) ? [email protected]mins +" Minutes " : "") +"till your next reward.";
		addtimer ([email protected]mins * 60000),strnpcinfo(0)+"::OnTimer";
		end;
	}

Claim:
	getitembound  512, 1, Bound_Account;
	#LastReward = [email protected]i;
	#DRewardClaim = 0;
	#DRewardTimer = 0;
	message strcharinfo(0),"[Reward Test]: You have collected your 15min reward.";
	[email protected]mins = (#LastReward + .MinWait - [email protected]i)%60;
	addtimer ([email protected]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 by Everade
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use and Privacy Policy.