Jump to content

AFK & GM check bei Autoscript


Pysk

Recommended Posts


  • Group:  Members
  • Topic Count:  75
  • Topics Per Day:  0.02
  • Content Count:  234
  • Reputation:   8
  • Joined:  01/19/12
  • Last Seen:  

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;
}
	

Link to comment
Share on other sites


  • Group:  Members
  • Topic Count:  49
  • Topics Per Day:  0.01
  • Content Count:  1507
  • Reputation:   227
  • Joined:  08/03/12
  • Last Seen:  

if ( checkidle() >= 900 ) {
}

Link to comment
Share on other sites


  • Group:  Members
  • Topic Count:  75
  • Topics Per Day:  0.02
  • Content Count:  234
  • Reputation:   8
  • Joined:  01/19/12
  • Last Seen:  

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


  • Group:  Developer
  • Topic Count:  7
  • Topics Per Day:  0.00
  • Content Count:  292
  • Reputation:   199
  • Joined:  05/03/13
  • Last Seen:  

checkidle hätte ich jetzt auch vorgeschlagen.

Für das GM Level: getgmlevel oder getgroupid

Link to comment
Share on other sites


  • Group:  Members
  • Topic Count:  75
  • Topics Per Day:  0.02
  • Content Count:  234
  • Reputation:   8
  • Joined:  01/19/12
  • Last Seen:  

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

  • 2 months later...

  • Group:  Members
  • Topic Count:  19
  • Topics Per Day:  0.00
  • Content Count:  192
  • Reputation:   43
  • Joined:  12/13/11
  • Last Seen:  

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 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...