[RELEASE] Achievementsystem

12/31/2014 13:32 Yiv#1
[Only registered and activated users can see links. Click Here To Register...]

Liebe Community,

da der Auftraggeber des Achievementsystems nicht mehr erreichbar ist, habe ich mich entschlossen - bevor es auf meiner Festplatte vergammelt -, das System zu releasen. Seht als Nach-Weihnachts / Silvester-Release ;)

Download im Anhang! ([Only registered and activated users can see links. Click Here To Register...])

Für alle, die eine Python Version unter 2.5 benutzen: Da in der uiachievement.py kurze if-Statements benutzt werden, müsst ihr die Version für unter 2.5 noch extra downloaden und diese statt der anderen nutzen. ([Only registered and activated users can see links. Click Here To Register...])

Achievementsystem-Demonstration

Einbau - Serverside:
Zuerst ladet ihr die achievementsystem.lua und die achievementsystem_extension.lua in euer Questverzeichnis (ggf. Unterordner/whatever).

Nun tragt ihr in die questlib.lua unten folgendes ein (evtl. den Pfad anpassen):
Code:
dofile("locale/germany/quest/achievementsystem_extension.lua")
Anschließend tragt ihr noch diese Befehle in eure quest_functions ein:
Code:
achievement.init
achievement.getNextLevelAchievementInfo
achievement.nextLevelAchievement
achievement.getMobAchievementInfo
achievement.increasePoints
achievement.getf
achievement.setf
achievement.login
achievement.initLevel
achievement.initShop
achievement.initMob
achievement.buyItem
achievement.clientCommunication


Einbau - Clientside:
Ihr packt den heruntergeladenen yiv work-Ordner in ein Archiv (bspw. in ETC) und packt das Archiv.

Nun entpackt ihr euer root-Archiv und fügt dort die uiachievement.py ein.

Anschließend öffnet ihr eure constInfo.py und fügt folgendes ein:
Code:
# YIV WORK: Achievement
CQC = 0
CQC_INFO = ""
Nun öffnet ihr eure interfacemodule.py und sucht nach def OpenQuestWindow(self, skin, idx): und fügt dort an den Anfang der Funktion folgendes ein:
Code:
		# YIV WORK: Achievement
		if constInfo.CQC == 1:
			return

Als letztes öffnet ihr nun noch die game.py und fügt ganz oben bei den imports diesen import ein
Code:
import uiAchievement
Nun sucht nach dem Konstruktor der GameWindow Klasse (def __init__(self, stream)) und fügt dort, fast am Ende, unter
Code:
		self.playerGauge = uiPlayerGauge.PlayerGauge(self)
		self.playerGauge.Hide()
noch das hinzu:
Code:
		# YIV WORK: Achievement
		self.achievementWindow = uiAchievement.AchievementBoard()
		self.achievementWindow.Close()

Nun sucht ihr - immernoch in der game.py - nach def Close(self): und fügt unter
Code:
self.ClearDictionary()
noch das hinzu:
Code:
		# YIV WORK: Achievement
		self.achievementWindow.Close()
		self.achievementWindow = None

Sucht nun nach def __BuildKeyDict(self): und fügt dort, irgendwo unter onPressKeyDict = {} nochfolgendes hinzu:
Code:
		# YIV WORK: Achievement
		onPressKeyDict[app.DIK_F6]	= lambda : self.achievementWindow.ToggleVisible()
Ihr seht hier, dass durch app.DIK_F6 die Taste F6 belegt wird, um das Achievement-Fenster zu öffnen/zu schließen. Falls diese Taste schon vergeben sein sollte, benutzt am besten einfach eine freie F-Taste oder irgendeine andere Taste, die eben noch nicht in Benutzung ist (bspw. X -> app.DIK_X).
Nun sucht ihr nach def __ServerCommand_Build(self): und fügt folgendes in das serverCommandList-Array ein:
Code:
			# YIV WORK: Achievement
			"achievement"			: self.achievementWindow.HandleAchievementServerCommand,
			"cqc_start"				: self.cqcStart,
			"cqc_get"				: self.cqcGet,
			"cqc_end"				: self.cqcEnd,

Als letztes fügt ihr nun noch am Ende der game.py folgendes ein:
Code:
	# YIV WORK: Achievement
	def cqcStart(self):
		constInfo.CQC = 1

	def cqcGet(self):
		net.SendQuestInputStringPacket(str(constInfo.CQC_INFO))

	def cqcEnd(self):
		constInfo.CQC_INFO = None
		constInfo.CQC = 0


Anpassen der Achievements & des Achievementshops:
Alle Anpassungen finden in der achievementsystem_extension.lua statt!
Ihr findet in Zeile 12 das Array der Items im Achievementshop:
Code:
achievement.shop = {
	{{14,1,10},{19,1,20},{11209,1,25},{11219,1,30},{0,0,0},{0,0,0},{0,0,0},{0,0,0}},
	{{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}},
	{{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}},
	{{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}},
	{{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}},
	{{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}},
	{{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}},
	{{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}},
}
Hier habe ich 4 Items (Schwert+4, Schwert+9, Mönchsplattenpanzer+9 und Eisenplattenpanzer+9) als Beispiele hinzugefügt. Ein Item-Eintrag ist folgendermaßen aufgebaut:
Code:
{VNUM, ANZAHL, PREIS}
Der Achievementshop ist 8 x 8 Slots groß (8 Zeilen zu je 8 Spalten) und dementsprechend ist auch das Array aufgebaut.

Für die Anpassung der Achievements findet ihr in der unbearbeiteten Datei in Zeile 29 die Definition der Mob-Achievements und in Zeile 41 die Definition der Level-Achievements.
Die Level-Achievements sollten eig. selbsterklärend sein, aber es ist zu beachten, dass sie der Reihe nach geordnet sein müssen, also das Level 20-Achievement folgt dem Level 10 Achievement und nicht umgekehrt.
Aufbau:
Code:
{LEVEL, ACHIEVEMENTPUNTKE}
Die Mob-Achievements sind ein wenig anders. Ich habe beispielsweise mal 4 Achievements angelegt.
Code:
achievement.mob[101] = {{10, 5}, {25, 10}, {50, 15}}
achievement.mob[102] = {{29, 29}}
achievement.mob[103] = {{88, 88}, {1337, 1000}}
achievement.mob[104] = {{99, 99}, {2674, 2000}}
Der Aufbau sieht also folgendermaßen aus:
Code:
achievement.mob[VNUM] = {...}
Ein Mob kann mehrere Achievements haben, diese müssen einfach durch ein Komma getrennt angegeben werden. Der Wildhund hat aktuell beispielsweise 3 Achievements (10 Kills, 25 Kills und 50 Kills). Ein Achievement ist so aufgebaut:
Code:
{KILLS, ACHIEVEMENTPUNKTE}
Nun habt ihr schonmal für einen Mob die Achievements eingestellt, es ist aber noch nicht verfügbar. Der Mob muss erst in Zeile 30 für ausgewählte Maps "freigeschalten" werden.
Code:
achievement.mob['L'] = {
	[1] = {101, 102},
	[21] = {101, 102, 103},
	[41] = {101, 102, 104},
}
Auf der Map mit Index 1 kann man also die Achievements für die Mobs mit den Vnums 101 & 102 erhalten, auf der Map mit dem Index 21 die Achievements für 101, 102 & 103 und auf der Map mit dem Index 41 die Achievements für 101, 102 & 104.



Achievement-Coupons Quest
Hier noch eine kleine Erweiterung: Diese Quest ermöglicht es euch, Achievement-Coupons hinzuzufügen. Einfach in die Quest-Liste (locale_list / quest_list / etc.) eintragen, die ID's und Werte anpassen und fertig. :)

Code:
quest achievement_coupons begin
	state start begin
		when 30093.use or 30094.use or 30095.use or 30096.use begin
			local points = ({
				[30093] = 25,
				[30094] = 50,
				[30095] = 100,
				[30096] = 200
			})[item.get_vnum()]
			achievement.increasePoints(points)
			item.remove()
		end
	end
end


Ich denke, das sollten nun die meisten hinbekommen, wer dennoch Fragen und/oder Probleme hat, kann natürlich hier im Thread Hilfe suchen.

Special Thanks:
Lee - Because of Brathering
Poccix - HA!
NyBu - Weil darum und Designs
DasSchwarzeT - Bischt du plöd?
JuleZ (aka. x"Kazuki) - Will auch mal in die Special Thanks

Mit freundlichen Grüßen
Yiv



Unterstützt durch:
[Only registered and activated users can see links. Click Here To Register...][Only registered and activated users can see links. Click Here To Register...]
12/31/2014 13:47 Cynaide™#2
Hey,
Sieht sehr gut aus :)
Danke das du es mit uns teilst

mfg
12/31/2014 13:49 Alergix2#3
Respekt !!
Hammer geil bestes Release
12/31/2014 13:53 ProfessorEnte#4
Ui schniekes Teilchen.
12/31/2014 13:54 'venToX#5
Wahrscheinlich das beste Achievementsystem, das bisher publiziert wurde, danke :'P
12/31/2014 13:56 nybu#6
Dat Werbung <3 :)
Mega geiles Release! Hab gehört demnächst kommt noch was krasses von dir? ;)

*hust*
12/31/2014 13:58 Snal™#7
Top Release Funktioniert


Gruß
Snal™ 1 Beitrag Wupp :)
12/31/2014 14:03 .SliceR#8
Sehr, sehr geil!
12/31/2014 14:07 Fydes#9
Schnieke nice, thx
12/31/2014 14:17 k1lL3rb0rN#10
Super Mega geiles Rilies!
Ein dickes #3 dafür :)
12/31/2014 14:19 Shaytan #11
Hammer danke dir für das Release euch allen einen guten rutsch
12/31/2014 14:21 x"Kazuki#12
Schlecht. #ironie

Super mega extremst bestes Release.
Endlich mal ein Special Thanks.

*freu*
12/31/2014 14:49 Snal™#13
HTML Code:
1231 14:47:10020 :: CPythonPlayer::SetItemData(dwSlotIndex=1, itemIndex=727269) - Failed to item data

1231 14:47:12470 :: Traceback (most recent call last):

1231 14:47:12470 ::   File "networkModule.py", line 231, in SetGamePhase

1231 14:47:12470 ::   File "system.py", line 130, in __pack_import

1231 14:47:12470 ::   File "system.py", line 110, in _process_result

1231 14:47:12470 ::   File "game.py", line 30, in ?

1231 14:47:12470 ::   File "system.py", line 130, in __pack_import

1231 14:47:12470 ::   File "
1231 14:47:12470 :: <string>
1231 14:47:12470 :: ", line 
1231 14:47:12470 :: 67
1231 14:47:12470 :: 

1231 14:47:12470 ::     
1231 14:47:12470 :: self.val = self.val if self.val <= self.valMax else self.valMax

1231 14:47:12470 ::     
1231 14:47:12470 ::  
1231 14:47:12470 ::  
1231 14:47:12470 ::  
1231 14:47:12470 ::  
1231 14:47:12470 ::  
1231 14:47:12470 ::  
1231 14:47:12470 ::  
1231 14:47:12470 ::  
1231 14:47:12470 ::  
1231 14:47:12470 ::  
1231 14:47:12470 ::  
1231 14:47:12470 ::  
1231 14:47:12470 ::  
1231 14:47:12470 ::  
1231 14:47:12470 ::  
1231 14:47:12470 ::  
1231 14:47:12470 ::  
1231 14:47:12470 ::  
1231 14:47:12470 ::  
1231 14:47:12470 ::  
1231 14:47:12470 ::  
1231 14:47:12470 :: ^

1231 14:47:12470 :: SyntaxError
1231 14:47:12470 :: : 
1231 14:47:12470 :: invalid syntax
1231 14:47:12470 :: 
mhm Tabs stimmen eigendlich , woran könnte es liegen
12/31/2014 14:51 Tuora#14
Super,danke dir sehr nützlich
12/31/2014 14:51 Poccix#15
Zeile 67 ist ein Syntax Error lieber Mensch zwei über mir :3 Post mal die Zeile.
____

Sieht schön aus kleiner ! :D