Register for your free account! | Forgot your password?

You last visited: Today at 14:46

  • Please register to post and access all features, it's quick, easy and FREE!

 

[c++] Timer Bugfix

Reply
 
Old   #1

 
elite*gold: 26
Join Date: Oct 2011
Posts: 1,244
Received Thanks: 966
[c++] Timer Bugfix

Viele von euch haben sich ja sicher schon gefragt, wieso man in einem timer questblock keinen weiteren timer starten kann, der den selben Namen trägt.

Bevor wir zum fix kommen sollten wir uns erst mal anschauen, wieso der Fehler überhaupt auftritt...

1) Ihr startet in eurer Quest einen timer.
2) Dies erstellt ein neues timer event. (questevent.cpp//quest_timer_event), welches eurem charakter zugeordnet wird. q.GetCurrentPC()->AddTimer
3) Wenn der timer "fällig" wird, wird der "when [...].timer" block in der quest ausgeführt.
4) In unserer quest versuchen wir, einen timer mit dem selben namen neu zu erstellen
5) Dies führt wieder q.GetCurrentPC()->AddTimer([...], quest_create_timer_event(...), [...]) aus
6) In AddTimer, wird bevor ein neuer timer hinzugefügt wird, der alte gecancelt (falls einer existent sein sollte)
7) Im CancelTimerEvent wird zum einen das event gecancelt, als auch quest_event_info::name gelöscht.
8) Der neue Timer, der in unserer quest im timer block erstellt wurde ist aktiv. (siehe sylog: QUEST add timer 0x3581e140 1)
9) Da unser "when [...].timer" block erfolgreich ausgeführt wurde, wird versucht, den timer in der EVENTFUNC aufzuräumen.
10) Timer versucht, auf quest_event_info::name zuzugreifen, um sich damit zu löschen. (RemoveTimerNotCancel(info->name))
11) Check, ob quest_event_info::name NULL ist, fehlt -> Server crasht.

Fix:
Code:
EVENTFUNC(quest_timer_event)
{
	quest_event_info * info = dynamic_cast<quest_event_info *>( event->info );
	if (info == NULL)
	{
		sys_err( "quest_timer_event> <Factor> Null pointer" );
		return 0;
	}

	CQuestManager & q = CQuestManager::instance();

	if (CHARACTER_MANAGER::instance().FindByPID(info->player_id))
	{
		if (!CQuestManager::instance().Timer(info->player_id, info->npc_id))
			return (passes_per_sec / 2 + 1);

		if (info->time_cycle != 0)
			return info->time_cycle;
	}

	if (info->name != NULL)
	{
		PC * pPC = q.GetPC(info->player_id);
		if (pPC)
			pPC->RemoveTimerNotCancel(info->name);
		else
			sys_err("quest::PC pointer null. player_id: %u", info->player_id);

		M2_DELETE_ARRAY(info->name);
		info->name = NULL;
	}
	return 0;
}
Beispiel zum Crash:

Code:
quest crash_test begin
	state start begin
		when login begin
			timer("test", 2)
			syschat("timer läuft.")
		end
		when test.timer begin
			syschat("timer ausgeführt.")
			cleartimer("test")
			timer("test", 2)
			syschat("timer läuft wieder.")
		end
	end
end
Fix ist experimentell+untested.



He3o Crysis is offline  
Thanks
9 Users
Old   #2
 
elite*gold: 8
Join Date: Oct 2010
Posts: 544
Received Thanks: 839
Nice Release Thanks Izz da.
Wird man hoffentlich auch auf deinem neuen Server sehen

MfG Gl0bal


Gl0bal is offline  
Thanks
1 User
Old   #3
 
elite*gold: 0
Join Date: Dec 2011
Posts: 11
Received Thanks: 0
So sweet :3
TY
VIPDANGER is offline  
Old   #4
 
elite*gold: 150
Join Date: Feb 2009
Posts: 553
Received Thanks: 497
Bug getestet. Bug gefixxt.

Dankeschön!

MfG
Cyber


Cyber36 is offline  
Old   #5
 
elite*gold: 0
Join Date: Sep 2017
Posts: 10
Received Thanks: 0
Thank, nice work.
HKwork is offline  
Old   #6
 
elite*gold: 171
Join Date: Mar 2015
Posts: 1,037
Received Thanks: 253
Nice Release, Danke.


'Crusher is offline  
Reply



« Previous Thread | Next Thread »

Similar Threads
Job Timer (Taxi Timer, etc)
A small utility to keep track of jobs that need timing. http://img834.imageshack.us/img834/6076/jt01.png Always read the changelog! To get...
2 Replies - SRO Hacks, Bots, Cheats & Exploits
Wartungsarbeiten + Bugfix 29.07.08
Metin2 Forum | News - Game | Wartungsarbeiten + Bugfix 29.07.08 was sagt ihr dazu -.-'
29 Replies - Metin2 Main - Discussions / Questions



All times are GMT +1. The time now is 14:46.


Powered by vBulletin®
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Abuse
Copyright ©2017 elitepvpers All Rights Reserved.