Welches Multilang hast du denn genutzt? Dann liegt es nicht an der Quest sondern daran das du was im SRC verhauen hast. Da hilft erstmal nur Dateien vergleichen von Clean Source und deinen. Hast ja sicher das Multilang zeug aufm PC, schau da erstmal durch was für den LC_Text bei .chat."xx" verantwortlich ist.
Beiträge von Dome
-
-
Vlt auch mal die Quest dazu posten?
-
Hey,
ich habe mal aus lange weile versucht das Minispiel Catch the King einzubauen und bin auch soweit mit vielen fixxes fast fertig, aber jetzt hänge ich schon seit Stunden damit fest dass wenn sich das Spielfenster öffnet, die Karten nicht anklickbar sind geschweige denn irgendein Tooltip auftaucht beim Hovern.
Bitte melden Sie sich an, um dieses Bild zu sehen.
Es gibt auch nirgends mehr Fehler in irgendwelchen syserr's, sowohl Client und Server sind leer.
Hat wer das ding auch schon eingebaut und weiß wie sich der Fehler beheben lässt?
Mfg
-
Kann es villeicht unter anderem sein das eine .dll ausgetauscht werden muss mit nem neueren toolset? Vor kurzem hatte ich festgestellt dass das Uploaden von Gildenlogos buggy ist und er die komisch/falsch konvertiert. Mitm Austausch von der devil.dll im client ging das nun problemlos. Villeicht muss eine neuere .dll rein von irgendwas. Wäre villeicht auch eine Idee
-
Ich habe ihm mein fertiges Login Interface übergeben damit er mir die Account-Safe funktion einbaut. Sehr empfehlenswert und sehr preiswert das ganze. Einziges manko bei meinem Auftrag, er hat mich 4 mal auf morgen verschoben. Ansonsten sehr freundlich und sein System klappt wunderbar!
Mit freundlichen Grüßen
-
Hallo,
ich hab mal wieder ein bisschen rumgewerkelt und da ist, wie ich finde, etwas ziemlich nützliches entstanden.
Da ich viele Quests besitze und es immer wieder mal vorkommt das ich an den Quest-Belohnungen feinjustiere wollte ich mir was schreiben um alle Belohnungen in einer Datei zu haben um nicht dauernd die Datei zu suchen, runter zu scrollen usw.
Jetzt hab ich eine funktion geschrieben die alles vollautomatisch macht.
Hier mal ein Bild:
Bitte melden Sie sich an, um dieses Bild zu sehen.
Im prinzip müsst ihr euch dann nur noch neue Tabellen in der Datei anlegen und in den jeweiligen Quests von euch die funktion "give_quest_rewards" einfügen. In den klammern dann der Name von eurer erstellten Tabelle. Das wars dann auch schon, der rest funktioniert vollkommen Automatisch wie ihr in dem Ingame Bild erkennt.
Die Zeitanzeige bei den Affect Boni wird immer auf oder abgerundet. Dh wenn ihr jetzt 60*60*24*400 = etwas über 1 Jahr eingebt dann kommt trotzdem noch 1 Jahr raus. Ebenfalls zeigt er nicht "3 Stunden und 30 Minuten" an. Wer das braucht kann sich die funktion aus den Dateien raussuchen und es für sich noch umschreiben.
Ich denke das kann für jemanden mit vielen Quests schon eine hilfreiche sache sein und nicht nur neulingen das Leben erleichtern.
P.s.: Das ding ist auch Multilanguage fähig, die Texte werden aus der translate.lua gezogen.
Nun viel Spaß damit
-
Ich habe iPeri's Homepage Script bestellt und möchte für seine Dienstleistung gerne ein Feedback hinterlassen.
Übersicht:
Kommunikation : 4/5
Fähigkeit : 5/5
Qualität : 5/5
Support : 5/5
Versandzeit : 2/5
Preis/Leistung : 5/5
Die Auftragvergabe verlief problemlos, kurz und knapp über das wichtigste gesprochen. Hierbei wurde gesagt es dauert bis Fertigstellung 2-4 Wochen. Die Fertigstellung verzögerte sich allerdings auf etwa 6-7 Wochen daher nur 2 von 5 Punkten bei der Versanzeit. Einen Punkt abzug bei der Kommunikation gibt es da es hin und wieder mal nen moment gedauert hat bis zur Anwort, alles in allem würde ich dies trotzdem noch als Vorbildlich einstufen. Mein Gefühl über seine Fähigkeiten was ich nach ein paar AnyDesk Sessions mitbekommen habe ist zweifelsfrei und zielstrebig. Ich hatte nie das Gefühl er wüsste manche dinge nicht, wodurch wir auch zum Support und die Qualität kommen. Er hat über AnyDesk die Homepage nochmal an einigen Ecken und Kanten glattgebügelt die mir nicht gefielen und setzt persönliche Wünsche direkt um. Die Qualität des Scriptes würde ich als nicht fachwissender PHP/HTML schreiberling auch mit 5 von 5 Bewerten und habe bisher nichts negatives über dieses gelesen.
Alles in allem kann ich iPeri nur empfehlen, sehr freundlich, hilfsbereit und weiß was er macht. Bis auf die längere Wartezeit bin ich total mit ihm zufrieden und empfehle jedem seine Dienstleistung.
Mit freundlichen Grüßen,
Dome
-
Hey,
ich hatte mal ne Quest geschrieben die ich jetzt wieder gesucht habe. Ja es gibt tausende Truhenquests und ich hab keine ahnung ob meine wie sie funktionieren schonmal released worden sind.
Es sind 2 verschiedene Quests, zum einen eine Büchertruhen Quest, habe sie fürs Release etwas erweitert da manche nicht so gut mit .lua können, gerade villeicht für anfänger interessant.
Und dann noch eine Item-Truhen Quest. Die ist eher für Itemshop-Truhen gedacht, kann man natürlich nutzen wie man will.
Büchertruhen-Quest:
Sie funktioniert automatisch. Man hat 3 optionen zur auswahl, denke die beschreibung hinter den Optionen ist aussagekräftig genug
LUA: chest_special_book- quest chest_special_book begin
- state start begin
- function settings()
- return
- {
- ["book_stack_count"] = 10 , -- Stackmenge
- ["book_run_count"] = 10 , -- Wie oft er Stacks pro Truhe gibt
- ["flag"] = 2 , -- Skillgruppe bezogen = 1 / Klasse bezogen = 2 / komplett Random = 3
- }
- end
- when CHEST_VNUM.use or CHEST_VNUM.use begin
- local settings = chest_special_book.settings()
- local book_table =
- {
- [0] = {
- {50401, 50402, 50403, 50404, 50405}, -- Körper-Krieger
- {50416, 50417, 50418, 50419, 50420}, -- Mental-Krieger
- {50401, 50402, 50403, 50404, 50405, 50416, 50417, 50418, 50419, 50420}, -- Krieger-Komplett
- },
- [1] = {
- {50431, 50432, 50433, 50434, 50435}, -- Nahkampf-Ninja
- {50446, 50447, 50448, 50449, 50450}, -- Fernkampf-Ninja
- {50431, 50432, 50433, 50434, 50435, 50446, 50447, 50448, 50449, 50450}, -- Ninja-Komplett
- },
- [2] = {
- {50461, 50462, 50463, 50464, 50465, 50466}, -- Waffen-Sura
- {50476, 50477, 50478, 50479, 50480, 50481}, -- Magie-Sura
- {50461, 50462, 50463, 50464, 50465, 50466, 50476, 50477, 50478, 50479, 50480, 50481}, -- Sura-Komplett
- },
- [3] = {
- {50491, 50492, 50493, 50494, 50495, 50496}, -- Drachen-Schamane
- {50506, 50507, 50508, 50509, 50510, 50511}, -- Heilungs-Schamane
- {50491, 50492, 50493, 50494, 50495, 50496, 50506, 50507, 50508, 50509, 50510, 50511}, -- Schamane-Komplett
- },
- [99] = {
- -- Alle Bücher
- 50401, 50402, 50403, 50404, 50405, 50416, 50417, 50418, 50419, 50420,
- 50431, 50432, 50433, 50434, 50435, 50446, 50447, 50448, 50449, 50450,
- 50461, 50462, 50463, 50464, 50465, 50466, 50476, 50477, 50478, 50479, 50480, 50481,
- 50491, 50492, 50493, 50494, 50495, 50496, 50506, 50507, 50508, 50509, 50510, 50511,
- },
- }
- local loop_book = 1
- local table_counts
- if settings.flag == 1 then
- table_counts = table.getn(book_table[pc.get_job()][pc.get_skill_group()])
- elseif settings.flag == 2 then
- table_counts = table.getn(book_table[pc.get_job()][3])
- elseif settings.flag == 3 then
- table_counts = table.getn(book_table[99])
- end
- while loop_book <= settings.book_run_count do
- local rnd = number(1, table_counts)
- if settings.flag == 1 then
- pc.give_item2(book_table[pc.get_job()][pc.get_skill_group()][rnd], settings.book_stack_count)
- elseif settings.flag == 2 then
- pc.give_item2(book_table[pc.get_job()][3][rnd], settings.book_stack_count)
- elseif settings.flag == 3 then
- pc.give_item2(book_table[99][rnd], settings.book_stack_count)
- end
- loop_book = loop_book + 1
- end
- item.remove()
- end
- end
- end
Itemtruhen-Quest:
einfach zu händeln, auch vollautomatische Quest. Man muss lediglich oben im when XXX.use die item_vnums eintragen immer gefolgt von einem or wenn es mehrere sein sollen und eben in der local item_table die Truhenvnums und deren Drop reinschreiben wie in der special_item.txt.
Bei dieser Quest erhält man ALLE Items die dort aufgezählt werden in der Menge wie sie dort stehen.
Beim anklicken sieht das ganze dann so aus (vollautomatisch):
Bitte melden Sie sich an, um dieses Bild zu sehen.
Die Fenstergröße passt sich zudem auch automatisch an je mehr Items man in der Truhe hat. Bis zu 20 Items sieht noch ganz ok aus, alles was drüber ist wirds hässlich.
LUA: chest_special_item- quest chest_special_item begin
- state start begin
- when CHEST_VNUM.use or CHEST_VNUM.use begin
- local item_table =
- { -- XX Truhe
- [CHEST_VNUM] = {
- {72001, 1}, -- Erfahrungsring (1h)
- {72004, 1}, -- Diebeshandschuh (1h)
- {72726, 1}, -- Elixier der Sonne (S)
- {72730, 1}, -- Elixier des Mondes (S)
- {71151, 30}, -- Grüner Zauber
- {71152, 10}, -- Grüne Stärke
- {70024, 5}, -- Segenskugel
- },
- -- XX Truhe
- [CHEST_VNUM] = {
- {72001, 1}, -- Erfahrungsring (1h)
- {72004, 1}, -- Diebeshandschuh (1h)
- {72726, 1}, -- Elixier der Sonne (S)
- {72730, 1}, -- Elixier des Mondes (S)
- {71151, 50}, -- Grüner Zauber
- {71152, 20}, -- Grüne Stärke
- {70024, 10}, -- Segenskugel
- {71044, 5}, -- Kritischer Kampf
- {71045, 5}, -- Durchbohrender Kampf
- },
- }
- local loop_check = 1
- local loop_reward = 1
- local item_count = table.getn(item_table[item.get_vnum()])
- if item_count <= 7 then -- 7 oder weniger
- say_size(350, 340)
- elseif item_count <= 10 then -- 10 oder weniger
- say_size(350, 390)
- elseif item_count <= 13 then -- 13 oder weniger
- say_size(350, 440)
- elseif item_count <= 16 then -- 16 oder weniger
- say_size(350, 490)
- elseif item_count <= 19 then -- 19 oder weniger
- say_size(350, 550)
- else -- alles ab 20
- say_size(350, 620)
- end
- say_item_vnum(item.get_vnum())
- while loop_check <= item_count do
- say("• "..item_table[item.get_vnum()][loop_check][2].."x "..item_name(item_table[item.get_vnum()][loop_check][1]))
- loop_check = loop_check + 1
- end
- say("")
- say_reward("Möchtest du die Truhe jetzt öffnen?")
- say("")
- local sel = select("Öffnen", "Abbrechen")
- if sel == 1 then
- while loop_reward <= item_count do
- pc.give_item2(item_table[item.get_vnum()][loop_reward][1], item_table[item.get_vnum()][loop_reward][2])
- loop_reward = loop_reward + 1
- end
- item.remove()
- else
- return
- end
- end
- end
- end
Nochmal anständig als anhang zum Download für die Tabs und viel spaß damit!
P.S: Releases gehen auch ohne Zwangs-Like-Funktion
-
schau mal in der quest tabelle in der DB ob du ein eintrag namens "eclipse" hast. Wenn ja, lösche die Zeile mit dem eintrag "xmas_boom". Und gewöhn dir an mit eclipse 0/1 dunkel zu machen.
-
Wo habe ich geschrieben das doch nicht? 'Asasel hat diesen Bug bei v142, hat sich die funktion neu geschrieben für v142 die jedoch nur dürftig funktioniert. Und ja ab v142 tritt dieser Bug auf.
Mit compilierung über v141 war bei ihm auch dieser Fehler verschwunden.
Sollte heißen wenn er mit v141 compiliert. Sorry xD
------------------------------
Bin auch mit V142 toolset unterwegs und hab das nicht
Sind beide Codes oben genau gleich bei dir?
-
Zitat
Wie macht sich der Bug den bemerbar?
Wenn einzelnde Gegenstände um einen herum liegen mag alles noch relativ gut funktionieren, werden es aber mehr Items und Yang nähe des Charakters so merkt man das man manchmal nichts mehr aufheben kann. Wenn man um den gesamten Drop herumläuft und öfters ^ oder Y drückt kann es sein das er manchmal Items aufhebt und manchmal nicht. Selten passiert es auch das man trotz mehrerer Drops aufheben kann, aber dann nimmt er nicht das was am nähesten ist zuerst sondern sehr willkürlich.
Tut mir leid habe keine richtige Fehlerbeschreibung im Startpost mit reingeschrieben. Jetzt ist die oben auch drinne
-
Bei meinem Kollegen, welcher meineswissens nach auch Martyfiles nutzt, trat das Problem ebenfalls auf. Mit compilierung über v141 war bei ihm auch dieser Fehler verschwunden. 'Asasel hat diesen Bug auch, er hat sich die Funktion aber neugeschrieben, sagt aber auch das seine funktion bisher nur dürftig funktioniert.
Ich habe als Basissource mainline_sg, mit dieser arbeite ich schon viele viele Jahre.
Du hast doch geschrieben, dass es ab v142 auftritt und jetzt doch nicht?
Wo habe ich geschrieben das doch nicht? 'Asasel hat diesen Bug bei v142, hat sich die funktion neu geschrieben für v142 die jedoch nur dürftig funktioniert. Und ja ab v142 tritt dieser Bug auf.
-
Bei meinem Kollegen, welcher meineswissens nach auch Martyfiles nutzt, trat das Problem ebenfalls auf. Wenn er mit toolset v141 compiliert, war bei ihm dieser auch Fehler verschwunden. 'Asasel hat diesen Bug auch, er hat sich die Funktion aber neugeschrieben, sagt aber auch das seine funktion bisher nur dürftig funktioniert.
Ich habe als Basissource mainline_sg, mit dieser arbeite ich schon viele viele Jahre.
-
Hallo,
Wie macht sich der Bug den bemerbar?
Wenn einzelnde Gegenstände um einen herum liegen mag alles noch relativ gut funktionieren, werden es aber mehr Items und Yang nähe des Charakters so merkt man das man manchmal nichts mehr aufheben kann. Wenn man um den gesamten Drop herumläuft und öfters ^ oder Y drückt kann es sein das er manchmal Items aufhebt und manchmal nicht. Selten passiert es auch das man trotz mehrerer Drops aufheben kann, aber dann nimmt er nicht das was am nähesten ist zuerst sondern sehr willkürlich.
Ein großen Dank an Lead der sich um dieses Problem gekümmert hat und nun wie es scheint einen vollständigen Fix dafür geschrieben hat!
So, hier der Fix:
In PythonItem.h über der Klasse einfügen:
C: PythonItem.hHier meine Funktionen für die PythonItem.cpp, einfach bei euch anpassen wie ihr es braucht. Ihr könnts eig. ersetzen denke ich.
C: PythonItem.cpp- bool CPythonItem::GetCloseMoney(const TPixelPosition &c_rPixelPosition, uint32_t*pdwItemID, uint32_t dwDistance)
- {
- uint32_t dwCloseItemID = 0;
- uint32_t dwCloseItemDistance = dwDistance * dwDistance;
- TGroundItemInstanceMap::iterator i;
- for (i = m_GroundItemInstanceMap.begin(); i != m_GroundItemInstanceMap.end(); ++i)
- {
- TGroundItemInstance *pInstance = i->second;
- if (pInstance->dwVirtualNumber != VNUM_MONEY)
- continue;
- uint32_t dwxDistance = DISTANCE_APPROX(c_rPixelPosition.x, pInstance->v3EndPosition.x);
- uint32_t dwyDistance = DISTANCE_APPROX(c_rPixelPosition.y, pInstance->v3EndPosition.y);
- uint32_t dwDistance = uint32_t(dwxDistance * dwxDistance + dwyDistance * dwyDistance);
- if (dwDistance < dwCloseItemDistance)
- {
- dwCloseItemID = i->first;
- dwCloseItemDistance = dwDistance;
- }
- }
- if (dwCloseItemDistance > dwDistance * dwDistance)
- return false;
- *pdwItemID = dwCloseItemID;
- return false;
- }
- bool CPythonItem::GetCloseItem(const TPixelPosition &c_rPixelPosition, uint32_t*pdwItemID, uint32_t dwDistance)
- {
- uint32_t dwCloseItemID = 0;
- uint32_t dwCloseItemDistance = dwDistance * dwDistance;
- TGroundItemInstanceMap::iterator i;
- for (i = m_GroundItemInstanceMap.begin(); i != m_GroundItemInstanceMap.end(); ++i)
- {
- TGroundItemInstance *pInstance = i->second;
- uint32_t dwxDistance = DISTANCE_APPROX(c_rPixelPosition.x, pInstance->v3EndPosition.x);
- uint32_t dwyDistance = DISTANCE_APPROX(c_rPixelPosition.y, pInstance->v3EndPosition.y);
- uint32_t dwDistance = uint32_t(dwxDistance * dwxDistance + dwyDistance * dwyDistance);
- if (dwDistance < dwCloseItemDistance)
- {
- dwCloseItemID = i->first;
- dwCloseItemDistance = dwDistance;
- }
- }
- if (dwCloseItemDistance > dwDistance * dwDistance)
- return false;
- *pdwItemID = dwCloseItemID;
- return true;
- }
Erklärung: Schuld waren zwei Dinge.
1) DWORD dwCloseItemDistance = 1000 * 1000; - Die Variable nutzt hardcode 1000 als maximale Distance, es sollte aber dwDistance genutzt werden was entweder 500 (auf dem Pferd) oder 300 (normaler Spieler) ist.
2) c_rPixelPosition.y-(-pInstance->v3EndPosition.y) - Kann negativ sein. DWORD(...) ihr versteht schon, Wertebereich geht bei unsigned Datentypen nicht ins Negative, deshalb können sie ja doppelt so groß sein wie signed Zahlen.
___________________________________________________________________________________________________________
Bonus:
Hier die CItem::DistanceValid - Funktion auf Serverseite. Falls der User läuft und dabei Dinge aufhebt, ändert er seine Position. Bis das Packet beim Server ankommt können das einige viele Koordis sein und der Spieler muss zurücklaufen zum Aufheben, zum Fixxen hab ich eine Tolleranzvariable eingeführt + das mit dem Pferd beachtet.
C- bool CItem::DistanceValid(LPCHARACTER ch)
- {
- if (!GetSectree())
- return false;
- int32_t iDist = DISTANCE_APPROX(GetX() - ch->GetX(), GetY() - ch->GetY());
- uint16_t max_distance = ch->IsRiding() ? 500 : 300;
- uint16_t tolerance = 150;
- if (iDist > max_distance + tolerance)
- {
- if (test_server)
- ch->ChatPacket(CHAT_TYPE_INFO, "%d: Distance is not valid: %d > %d", GetID(), iDist, max_distance + tolerance);
- return false;
- }
- return true;
- }
Mit freundlichen Grüßen!
-
Hey ich hab mal versucht das einzubauen, funktioniert soweit auch fast komplett. Mein Problem liegt darin das wenn ein Mob ein Affect bekommt und ich dann den Fokus auf ein anderen Mob mache und wieder zurück zu dem Mob mit dem Affect fokusiere, ist das Icon nicht mehr sichtbar. Genau so wie wenn ein mob ein Affect bekommt und ich dann auf dieses switche ist es auch nicht sichtbar. Ich habe auch schon ne Ausgabe mit TraceError gemacht um zu schauen ob er überhaupt ein Affect setzt / setzen würde:
Code: BINARY_NEW_AddAffect- def BINARY_NEW_AddAffect(self, type, pointIdx, value, duration):
- print "BINARY_NEW_AddAffect", type, pointIdx, value, duration
- self.NEW_AFFECT_LIST = []
- if (app.ENABLE_NEW_AFFECT_POTION):
- self.NEW_AFFECT_LIST = mainAffectPotion["affect"][:] # Assigned the list [chr.AFFECT_POTION_1, chr.AFFECT_POTION_2 ......]
- if (app.ENABLE_AFFECT_POLYMORPH_REMOVE):
- self.NEW_AFFECT_LIST.append(chr.NEW_AFFECT_POLYMORPH) # += chr.NEW_AFFECT_POLYMORPH if is enabled.
- if type < 500 and not type in self.NEW_AFFECT_LIST and not self.ignoreCheck:
- return
- if type == chr.NEW_AFFECT_MALL:
- affect = self.MALL_DESC_IDX_START + pointIdx
- else:
- affect = type
- if self.affectImageDict.has_key(affect):
- return
- if not self.AFFECT_DATA_DICT.has_key(affect):
- if not self.ignoreCheck:
- return
- if affect == chr.NEW_AFFECT_NO_DEATH_PENALTY or\
- affect == chr.NEW_AFFECT_SKILL_BOOK_BONUS or\
- affect == chr.NEW_AFFECT_AUTO_SP_RECOVERY or\
- affect == chr.NEW_AFFECT_AUTO_HP_RECOVERY or\
- affect == chr.NEW_AFFECT_SKILL_BOOK_NO_DELAY:
- duration = 0
- affectData = self.AFFECT_DATA_DICT[affect]
- description = affectData[0]
- filename = affectData[1]
- if pointIdx == player.POINT_MALL_ITEMBONUS or\
- pointIdx == player.POINT_MALL_GOLDBONUS:
- value = 1 + float(value) / 100.0
- trashValue = 123
- if trashValue == 1:
- try:
- image = None
- if affect == chr.NEW_AFFECT_AUTO_SP_RECOVERY:
- image.SetPotionType(player.AUTO_POTION_TYPE_SP)
- image = self.autoPotionImageSP
- else:
- image.SetPotionType(player.AUTO_POTION_TYPE_HP)
- image = self.autoPotionImageHP
- image.SetParent(self)
- image.Show()
- image.OnUpdateAutoPotionImage()
- self.affectImageDict[affect] = image
- self.__ArrangeImageList()
- except Exception, e:
- print "except Aff auto potion affect ", e
- pass
- else:
- if affect != chr.NEW_AFFECT_AUTO_SP_RECOVERY and affect != chr.NEW_AFFECT_AUTO_HP_RECOVERY:
- if app.ENABLE_TARGET_AFFECT:
- if callable(description):
- description = description(float(value))
- else:
- description = description(float(value))
- try:
- print "Add affect %s" % affect
- image = AffectImage()
- image.SetParent(self)
- image.LoadImage(filename)
- image.SetDescription(description)
- image.SetDuration(duration)
- image.SetAffect(affect)
- if affect == chr.NEW_AFFECT_EXP_BONUS_EURO_FREE or\
- affect == chr.NEW_AFFECT_EXP_BONUS_EURO_FREE_UNDER_15 or\
- self.INFINITE_AFFECT_DURATION < duration:
- image.SetClock(FALSE)
- image.UpdateDescription()
- elif affect == chr.NEW_AFFECT_AUTO_SP_RECOVERY or affect == chr.NEW_AFFECT_AUTO_HP_RECOVERY:
- image.UpdateAutoPotionDescription()
- else:
- image.UpdateDescription()
- if affect == chr.NEW_AFFECT_DRAGON_SOUL_DECK1 or affect == chr.NEW_AFFECT_DRAGON_SOUL_DECK2:
- image.SetScale(1, 1)
- else:
- image.SetScale(0.8, 0.8)
- image.SetSkillAffectFlag(FALSE)
- image.Show()
- import dbg
- dbg.TraceError("Add affect down [%d]" % (affect))
- self.affectImageDict[affect] = image
- self.__ArrangeImageList()
- except Exception, e:
- print "except Aff affect ", e
- pass
Er gibt mir in der Syserr auch den richtigen affect aus wenn ich zwischen den mobs switche, aber er lässt dann kein Icon anzeigen.
Halt NUR wenn ich gerade den Mob fokusiere welcher in dem Moment ein Affect bekommt.
Hier die ganze uiAffectShower.py
Code- import ui
- import localeInfo
- import constInfo
- import chr
- import item
- import app
- import skill
- import player
- import uiToolTip
- import math
- if app.ENABLE_NEW_AFFECT_POTION:
- mainAffectPotion = {
- "affect" : [
- chr.AFFECT_POTION_1, chr.AFFECT_POTION_2, chr.AFFECT_POTION_3, chr.AFFECT_POTION_4, chr.AFFECT_POTION_5, chr.AFFECT_POTION_6,
- ],
- "image" : [
- ("icon/item/blend_affect/5082%d.tga" % (i + 1)) for i in xrange(len("affect"))
- ],
- "desc" : [
- localeInfo.TOOLTIP_AFFECT_POTION_1, localeInfo.TOOLTIP_AFFECT_POTION_2, localeInfo.TOOLTIP_AFFECT_POTION_3, localeInfo.TOOLTIP_AFFECT_POTION_4, localeInfo.TOOLTIP_AFFECT_POTION_5, localeInfo.TOOLTIP_AFFECT_POTION_6,
- ]
- }
- # WEDDING
- class LovePointImage(ui.ExpandedImageBox):
- FILE_PATH = "d:/ymir work/"+constInfo.GetUI()+"/pattern/LovePoint/"
- FILE_DICT = {
- 0 : FILE_PATH + "01.dds",
- 1 : FILE_PATH + "02.dds",
- 2 : FILE_PATH + "02.dds",
- 3 : FILE_PATH + "03.dds",
- 4 : FILE_PATH + "04.dds",
- 5 : FILE_PATH + "05.dds",
- }
- def __init__(self):
- ui.ExpandedImageBox.__init__(self)
- self.loverName = ""
- self.lovePoint = 0
- self.toolTip = uiToolTip.ToolTip(100)
- self.toolTip.HideToolTip()
- def __del__(self):
- ui.ExpandedImageBox.__del__(self)
- def SetLoverInfo(self, name, lovePoint):
- self.loverName = name
- self.lovePoint = lovePoint
- self.__Refresh()
- def OnUpdateLovePoint(self, lovePoint):
- self.lovePoint = lovePoint
- self.__Refresh()
- def __Refresh(self):
- self.lovePoint = max(0, self.lovePoint)
- self.lovePoint = min(100, self.lovePoint)
- if 0 == self.lovePoint:
- loveGrade = 0
- else:
- loveGrade = self.lovePoint / 25 + 1
- fileName = self.FILE_DICT.get(loveGrade, self.FILE_PATH+"00.dds")
- try:
- self.LoadImage(fileName)
- except:
- import dbg
- dbg.TraceError("LovePointImage.SetLoverInfo(lovePoint=%d) - LoadError %s" % (self.lovePoint, fileName))
- self.SetScale(0.8, 0.8)
- self.toolTip.ClearToolTip()
- self.toolTip.SetTitle(self.loverName)
- self.toolTip.AppendTextLine(localeInfo.AFF_LOVE_POINT % (self.lovePoint))
- self.toolTip.ResizeToolTip()
- def OnMouseOverIn(self):
- self.toolTip.ShowToolTip()
- def OnMouseOverOut(self):
- self.toolTip.HideToolTip()
- # END_OF_WEDDING
- class HorseImage(ui.ExpandedImageBox):
- FILE_PATH = "d:/ymir work/"+constInfo.GetUI()+"/pattern/HorseState/"
- FILE_DICT = {
- 00 : FILE_PATH+"00.dds",
- 01 : FILE_PATH+"00.dds",
- 02 : FILE_PATH+"00.dds",
- 03 : FILE_PATH+"00.dds",
- 10 : FILE_PATH+"10.dds",
- 11 : FILE_PATH+"11.dds",
- 12 : FILE_PATH+"12.dds",
- 13 : FILE_PATH+"13.dds",
- 20 : FILE_PATH+"20.dds",
- 21 : FILE_PATH+"21.dds",
- 22 : FILE_PATH+"22.dds",
- 23 : FILE_PATH+"23.dds",
- 30 : FILE_PATH+"30.dds",
- 31 : FILE_PATH+"31.dds",
- 32 : FILE_PATH+"32.dds",
- 33 : FILE_PATH+"33.dds",
- }
- def __init__(self):
- ui.ExpandedImageBox.__init__(self)
- #self.textLineList = []
- self.toolTip = uiToolTip.ToolTip(100)
- self.toolTip.HideToolTip()
- def __GetHorseGrade(self, level):
- if 0 == level:
- return 0
- return (level-1)/10 + 1
- def SetState(self, level, health, battery):
- #self.textLineList=[]
- self.toolTip.ClearToolTip()
- if level>0:
- try:
- grade = self.__GetHorseGrade(level)
- self.__AppendText(localeInfo.LEVEL_LIST[grade])
- except IndexError:
- print "HorseImage.SetState(level=%d, health=%d, battery=%d) - Unknown Index" % (level, health, battery)
- return
- try:
- healthName=localeInfo.HEALTH_LIST[health]
- if len(healthName)>0:
- self.__AppendText(healthName)
- except IndexError:
- print "HorseImage.SetState(level=%d, health=%d, battery=%d) - Unknown Index" % (level, health, battery)
- return
- if health>0:
- if battery==0:
- self.__AppendText(localeInfo.NEEFD_REST)
- try:
- fileName=self.FILE_DICT[health*10+battery]
- except KeyError:
- print "HorseImage.SetState(level=%d, health=%d, battery=%d) - KeyError" % (level, health, battery)
- try:
- self.LoadImage(fileName)
- except:
- print "HorseImage.SetState(level=%d, health=%d, battery=%d) - LoadError %s" % (level, health, battery, fileName)
- self.SetScale(0.8, 0.8)
- def __AppendText(self, text):
- self.toolTip.AppendTextLine(text)
- self.toolTip.ResizeToolTip()
- #x=self.GetWidth()/2
- #textLine = ui.TextLine()
- #textLine.SetParent(self)
- #textLine.SetSize(0, 0)
- #textLine.SetOutline()
- #textLine.Hide()
- #textLine.SetPosition(x, 40+len(self.textLineList)*16)
- #textLine.SetText(text)
- #self.textLineList.append(textLine)
- def OnMouseOverIn(self):
- #for textLine in self.textLineList:
- # textLine.Show()
- self.toolTip.ShowToolTip()
- def OnMouseOverOut(self):
- #for textLine in self.textLineList:
- # textLine.Hide()
- self.toolTip.HideToolTip()
- # AUTO_POTION
- class AutoPotionImage(ui.ExpandedImageBox):
- FILE_PATH_HP = "d:/ymir work/"+constInfo.GetUI()+"/pattern/auto_hpgauge/"
- FILE_PATH_SP = "d:/ymir work/"+constInfo.GetUI()+"/pattern/auto_spgauge/"
- def __init__(self):
- ui.ExpandedImageBox.__init__(self)
- self.loverName = ""
- self.lovePoint = 0
- self.potionType = player.AUTO_POTION_TYPE_HP
- self.filePath = ""
- self.toolTip = uiToolTip.ToolTip(100)
- self.toolTip.HideToolTip()
- def __del__(self):
- ui.ExpandedImageBox.__del__(self)
- def SetPotionType(self, type):
- self.potionType = type
- if player.AUTO_POTION_TYPE_HP == type:
- self.filePath = self.FILE_PATH_HP
- elif player.AUTO_POTION_TYPE_SP == type:
- self.filePath = self.FILE_PATH_SP
- def OnUpdateAutoPotionImage(self):
- self.__Refresh()
- def __Refresh(self):
- print "__Refresh"
- isActivated, currentAmount, totalAmount, slotIndex = player.GetAutoPotionInfo(self.potionType)
- amountPercent = (float(currentAmount) / totalAmount) * 100.0
- grade = math.ceil(amountPercent / 20)
- if 5.0 > amountPercent:
- grade = 0
- if 80.0 < amountPercent:
- grade = 4
- if 90.0 < amountPercent:
- grade = 5
- fmt = self.filePath + "%.2d.dds"
- fileName = fmt % grade
- print self.potionType, amountPercent, fileName
- try:
- self.LoadImage(fileName)
- except:
- import dbg
- dbg.TraceError("AutoPotionImage.__Refresh(potionType=%d) - LoadError %s" % (self.potionType, fileName))
- self.SetScale(0.8, 0.8)
- self.toolTip.ClearToolTip()
- if player.AUTO_POTION_TYPE_HP == type:
- self.toolTip.SetTitle(localeInfo.TOOLTIP_AUTO_POTION_HP)
- else:
- self.toolTip.SetTitle(localeInfo.TOOLTIP_AUTO_POTION_SP)
- self.toolTip.AppendTextLine(localeInfo.TOOLTIP_AUTO_POTION_REST % (amountPercent))
- self.toolTip.ResizeToolTip()
- def OnMouseOverIn(self):
- self.toolTip.ShowToolTip()
- def OnMouseOverOut(self):
- self.toolTip.HideToolTip()
- # END_OF_AUTO_POTION
- class AffectImage(ui.ExpandedImageBox):
- def __init__(self):
- ui.ExpandedImageBox.__init__(self)
- self.toolTipText = None
- self.isSkillAffect = TRUE
- self.description = None
- self.endTime = 0
- self.affect = None
- self.isClocked = TRUE
- if (app.ENABLE_AFFECT_POLYMORPH_REMOVE):
- self.polymorphQuestionDialog = None
- def SetAffect(self, affect):
- self.affect = affect
- def GetAffect(self):
- return self.affect
- def SetToolTipText(self, text, x = 0, y = -19):
- if not self.toolTipText:
- textLine = ui.TextLine()
- textLine.SetParent(self)
- textLine.SetSize(0, 0)
- textLine.SetOutline()
- textLine.Hide()
- self.toolTipText = textLine
- self.toolTipText.SetText(text)
- w, h = self.toolTipText.GetTextSize()
- self.toolTipText.SetPosition(max(0, x + self.GetWidth()/2 - w/2), y)
- def SetDescription(self, description):
- self.description = description
- def SetDuration(self, duration):
- self.endTime = 0
- if duration > 0:
- self.endTime = app.GetGlobalTimeStamp() + duration
- def UpdateAutoPotionDescription(self):
- potionType = 0
- if self.affect == chr.NEW_AFFECT_AUTO_HP_RECOVERY:
- potionType = player.AUTO_POTION_TYPE_HP
- else:
- potionType = player.AUTO_POTION_TYPE_SP
- isActivated, currentAmount, totalAmount, slotIndex = player.GetAutoPotionInfo(potionType)
- #print "UpdateAutoPotionDescription ", isActivated, currentAmount, totalAmount, slotIndex
- amountPercent = 0.0
- try:
- amountPercent = (float(currentAmount) / totalAmount) * 100.0
- except:
- amountPercent = 100.0
- self.SetToolTipText(self.description % amountPercent, 0, 40)
- def SetClock(self, isClocked):
- self.isClocked = isClocked
- def UpdateDescription(self):
- if not self.isClocked:
- self.__UpdateDescription2()
- return
- if not self.description:
- return
- toolTip = self.description
- if self.endTime > 0:
- leftTime = ""
- if app.ENABLE_TARGET_AFFECT:
- restTime = self.endTime - app.GetGlobalTimeStamp()
- if restTime < 60:
- leftTime = str(restTime) + " " + localeInfo.SECOND
- else:
- leftTime = localeInfo.SecondToDHM(restTime)
- else:
- leftTime = localeInfo.SecondToDHM(self.endTime - app.GetGlobalTimeStamp())
- toolTip += " (%s : %s)" % (localeInfo.LEFT_TIME, leftTime)
- self.SetToolTipText(toolTip, 0, 40)
- #µ¶ÀϹöÀü¿¡¼ ½Ã°£À» Á¦°ÅÇϱâ À§Çؼ »ç¿ë
- def __UpdateDescription2(self):
- if not self.description:
- return
- toolTip = self.description
- self.SetToolTipText(toolTip, 0, 40)
- def SetSkillAffectFlag(self, flag):
- self.isSkillAffect = flag
- def IsSkillAffect(self):
- return self.isSkillAffect
- if (app.ENABLE_AFFECT_POLYMORPH_REMOVE):
- def OnPolymorphQuestionDialog(self):
- import uiCommon
- self.polymorphQuestionDialog = uiCommon.QuestionDialog()
- self.polymorphQuestionDialog.SetText(localeInfo.POLYMORPH_AFFECT_REMOVE_QUESTION)
- self.polymorphQuestionDialog.SetWidth(350)
- self.polymorphQuestionDialog.SetAcceptEvent(lambda arg = TRUE: self.OnClosePolymorphQuestionDialog(arg))
- self.polymorphQuestionDialog.SetCancelEvent(lambda arg = FALSE: self.OnClosePolymorphQuestionDialog(arg))
- self.polymorphQuestionDialog.Open()
- def OnClosePolymorphQuestionDialog(self, answer):
- import net
- if not self.polymorphQuestionDialog:
- return
- self.polymorphQuestionDialog.Close()
- self.polymorphQuestionDialog = None
- if not answer:
- return
- net.SendChatPacket("/remove_polymorph")
- return TRUE
- def OnMouseOverIn(self):
- if self.toolTipText:
- self.toolTipText.Show()
- if (app.ENABLE_AFFECT_POLYMORPH_REMOVE):
- if self.affect == chr.NEW_AFFECT_POLYMORPH:
- self.OnPolymorphQuestionDialog()
- def OnMouseOverOut(self):
- if self.toolTipText:
- self.toolTipText.Hide()
- class AffectShower(ui.Window):
- MALL_DESC_IDX_START = 1000
- IMAGE_STEP = 28
- AFFECT_MAX_NUM = 32
- INFINITE_AFFECT_DURATION = 0x1FFFFFFF
- AFFECT_DATA_DICT = {
- chr.AFFECT_POISON : (localeInfo.SKILL_TOXICDIE, "d:/ymir work/"+constInfo.GetUI()+"/skill/common/affect/poison.sub"),
- chr.AFFECT_SLOW : (localeInfo.SKILL_SLOW, "d:/ymir work/"+constInfo.GetUI()+"/skill/common/affect/slow.sub"),
- chr.AFFECT_STUN : (localeInfo.SKILL_STUN, "d:/ymir work/"+constInfo.GetUI()+"/skill/common/affect/stun.sub"),
- chr.AFFECT_ATT_SPEED_POTION : (localeInfo.SKILL_INC_ATKSPD, "d:/ymir work/"+constInfo.GetUI()+"/skill/common/affect/Increase_Attack_Speed.sub"),
- chr.AFFECT_MOV_SPEED_POTION : (localeInfo.SKILL_INC_MOVSPD, "d:/ymir work/"+constInfo.GetUI()+"/skill/common/affect/Increase_Move_Speed.sub"),
- chr.AFFECT_FISH_MIND : (localeInfo.SKILL_FISHMIND, "d:/ymir work/"+constInfo.GetUI()+"/skill/common/affect/fishmind.sub"),
- chr.AFFECT_JEONGWI : (localeInfo.SKILL_JEONGWI, "d:/ymir work/"+constInfo.GetUI()+"/skill/warrior/jeongwi_03.sub",),
- chr.AFFECT_GEOMGYEONG : (localeInfo.SKILL_GEOMGYEONG, "d:/ymir work/"+constInfo.GetUI()+"/skill/warrior/geomgyeong_03.sub",),
- chr.AFFECT_CHEONGEUN : (localeInfo.SKILL_CHEONGEUN, "d:/ymir work/"+constInfo.GetUI()+"/skill/warrior/cheongeun_03.sub",),
- chr.AFFECT_GYEONGGONG : (localeInfo.SKILL_GYEONGGONG, "d:/ymir work/"+constInfo.GetUI()+"/skill/assassin/gyeonggong_03.sub",),
- chr.AFFECT_EUNHYEONG : (localeInfo.SKILL_EUNHYEONG, "d:/ymir work/"+constInfo.GetUI()+"/skill/assassin/eunhyeong_03.sub",),
- chr.AFFECT_GWIGEOM : (localeInfo.SKILL_GWIGEOM, "d:/ymir work/"+constInfo.GetUI()+"/skill/sura/gwigeom_03.sub",),
- chr.AFFECT_GONGPO : (localeInfo.SKILL_GONGPO, "d:/ymir work/"+constInfo.GetUI()+"/skill/sura/gongpo_03.sub",),
- chr.AFFECT_JUMAGAP : (localeInfo.SKILL_JUMAGAP, "d:/ymir work/"+constInfo.GetUI()+"/skill/sura/jumagap_03.sub"),
- chr.AFFECT_HOSIN : (localeInfo.SKILL_HOSIN, "d:/ymir work/"+constInfo.GetUI()+"/skill/shaman/hosin_03.sub",),
- chr.AFFECT_BOHO : (localeInfo.SKILL_BOHO, "d:/ymir work/"+constInfo.GetUI()+"/skill/shaman/boho_03.sub",),
- chr.AFFECT_KWAESOK : (localeInfo.SKILL_KWAESOK, "d:/ymir work/"+constInfo.GetUI()+"/skill/shaman/kwaesok_03.sub",),
- chr.AFFECT_HEUKSIN : (localeInfo.SKILL_HEUKSIN, "d:/ymir work/"+constInfo.GetUI()+"/skill/sura/heuksin_03.sub",),
- chr.AFFECT_MUYEONG : (localeInfo.SKILL_MUYEONG, "d:/ymir work/"+constInfo.GetUI()+"/skill/sura/muyeong_03.sub",),
- chr.AFFECT_GICHEON : (localeInfo.SKILL_GICHEON, "d:/ymir work/"+constInfo.GetUI()+"/skill/shaman/gicheon_03.sub",),
- chr.AFFECT_JEUNGRYEOK : (localeInfo.SKILL_JEUNGRYEOK, "d:/ymir work/"+constInfo.GetUI()+"/skill/shaman/jeungryeok_03.sub",),
- chr.AFFECT_PABEOP : (localeInfo.SKILL_PABEOP, "d:/ymir work/"+constInfo.GetUI()+"/skill/sura/pabeop_03.sub",),
- chr.AFFECT_FALLEN_CHEONGEUN : (localeInfo.SKILL_CHEONGEUN, "d:/ymir work/"+constInfo.GetUI()+"/skill/warrior/cheongeun_03.sub",),
- 28 : (localeInfo.SKILL_FIRE, "d:/ymir work/"+constInfo.GetUI()+"/skill/sura/hwayeom_03.sub",),
- chr.AFFECT_CHINA_FIREWORK : (localeInfo.SKILL_POWERFUL_STRIKE, "d:/ymir work/"+constInfo.GetUI()+"/skill/common/affect/powerfulstrike.sub",),
- #64 - END
- chr.NEW_AFFECT_EXP_BONUS : (localeInfo.TOOLTIP_MALL_EXPBONUS_STATIC, "d:/ymir work/"+constInfo.GetUI()+"/skill/common/affect/exp_bonus.sub",),
- chr.NEW_AFFECT_ITEM_BONUS : (localeInfo.TOOLTIP_MALL_ITEMBONUS_STATIC, "d:/ymir work/"+constInfo.GetUI()+"/skill/common/affect/item_bonus.sub",),
- chr.NEW_AFFECT_SAFEBOX : (localeInfo.TOOLTIP_MALL_SAFEBOX, "d:/ymir work/"+constInfo.GetUI()+"/skill/common/affect/safebox.sub",),
- chr.NEW_AFFECT_AUTOLOOT : (localeInfo.TOOLTIP_MALL_AUTOLOOT, "d:/ymir work/"+constInfo.GetUI()+"/skill/common/affect/autoloot.sub",),
- chr.NEW_AFFECT_FISH_MIND : (localeInfo.TOOLTIP_MALL_FISH_MIND, "d:/ymir work/"+constInfo.GetUI()+"/skill/common/affect/fishmind.sub",),
- chr.NEW_AFFECT_MARRIAGE_FAST : (localeInfo.TOOLTIP_MALL_MARRIAGE_FAST, "d:/ymir work/"+constInfo.GetUI()+"/skill/common/affect/marriage_fast.sub",),
- chr.NEW_AFFECT_GOLD_BONUS : (localeInfo.TOOLTIP_MALL_GOLDBONUS_STATIC, "d:/ymir work/"+constInfo.GetUI()+"/skill/common/affect/gold_bonus.sub",),
- chr.NEW_AFFECT_NO_DEATH_PENALTY : (localeInfo.TOOLTIP_APPLY_NO_DEATH_PENALTY, "d:/ymir work/"+constInfo.GetUI()+"/skill/common/affect/gold_premium.sub"),
- chr.NEW_AFFECT_SKILL_BOOK_BONUS : (localeInfo.TOOLTIP_APPLY_SKILL_BOOK_BONUS, "d:/ymir work/"+constInfo.GetUI()+"/skill/common/affect/gold_premium.sub"),
- chr.NEW_AFFECT_SKILL_BOOK_NO_DELAY : (localeInfo.TOOLTIP_APPLY_SKILL_BOOK_NO_DELAY, "d:/ymir work/"+constInfo.GetUI()+"/skill/common/affect/gold_premium.sub"),
- # ÀÚµ¿¹°¾à hp, sp
- chr.NEW_AFFECT_AUTO_HP_RECOVERY : (localeInfo.TOOLTIP_AUTO_POTION_REST, "d:/ymir work/"+constInfo.GetUI()+"/pattern/auto_hpgauge/05.dds"),
- chr.NEW_AFFECT_AUTO_SP_RECOVERY : (localeInfo.TOOLTIP_AUTO_POTION_REST, "d:/ymir work/"+constInfo.GetUI()+"/pattern/auto_spgauge/05.dds"),
- #chr.NEW_AFFECT_AUTO_HP_RECOVERY : (localeInfo.TOOLTIP_AUTO_POTION_REST, "d:/ymir work/"+constInfo.GetUI()+"/skill/common/affect/gold_premium.sub"),
- #chr.NEW_AFFECT_AUTO_SP_RECOVERY : (localeInfo.TOOLTIP_AUTO_POTION_REST, "d:/ymir work/"+constInfo.GetUI()+"/skill/common/affect/gold_bonus.sub"),
- MALL_DESC_IDX_START+player.POINT_MALL_ATTBONUS : (localeInfo.TOOLTIP_MALL_ATTBONUS_STATIC, "d:/ymir work/"+constInfo.GetUI()+"/skill/common/affect/att_bonus.sub",),
- MALL_DESC_IDX_START+player.POINT_MALL_DEFBONUS : (localeInfo.TOOLTIP_MALL_DEFBONUS_STATIC, "d:/ymir work/"+constInfo.GetUI()+"/skill/common/affect/def_bonus.sub",),
- MALL_DESC_IDX_START+player.POINT_MALL_EXPBONUS : (localeInfo.TOOLTIP_MALL_EXPBONUS, "d:/ymir work/"+constInfo.GetUI()+"/skill/common/affect/exp_bonus.sub",),
- MALL_DESC_IDX_START+player.POINT_MALL_ITEMBONUS : (localeInfo.TOOLTIP_MALL_ITEMBONUS, "d:/ymir work/"+constInfo.GetUI()+"/skill/common/affect/item_bonus.sub",),
- MALL_DESC_IDX_START+player.POINT_MALL_GOLDBONUS : (localeInfo.TOOLTIP_MALL_GOLDBONUS, "d:/ymir work/"+constInfo.GetUI()+"/skill/common/affect/gold_bonus.sub",),
- MALL_DESC_IDX_START+player.POINT_CRITICAL_PCT : (localeInfo.TOOLTIP_APPLY_CRITICAL_PCT,"d:/ymir work/"+constInfo.GetUI()+"/skill/common/affect/critical.sub"),
- MALL_DESC_IDX_START+player.POINT_PENETRATE_PCT : (localeInfo.TOOLTIP_APPLY_PENETRATE_PCT, "d:/ymir work/"+constInfo.GetUI()+"/skill/common/affect/gold_premium.sub"),
- MALL_DESC_IDX_START+player.POINT_MAX_HP_PCT : (localeInfo.TOOLTIP_MAX_HP_PCT, "d:/ymir work/"+constInfo.GetUI()+"/skill/common/affect/gold_premium.sub"),
- MALL_DESC_IDX_START+player.POINT_MAX_SP_PCT : (localeInfo.TOOLTIP_MAX_SP_PCT, "d:/ymir work/"+constInfo.GetUI()+"/skill/common/affect/gold_premium.sub"),
- MALL_DESC_IDX_START+player.POINT_PC_BANG_EXP_BONUS : (localeInfo.TOOLTIP_MALL_EXPBONUS_P_STATIC, "d:/ymir work/"+constInfo.GetUI()+"/skill/common/affect/EXP_Bonus_p_on.sub",),
- MALL_DESC_IDX_START+player.POINT_PC_BANG_DROP_BONUS: (localeInfo.TOOLTIP_MALL_ITEMBONUS_P_STATIC, "d:/ymir work/"+constInfo.GetUI()+"/skill/common/affect/Item_Bonus_p_on.sub",),
- }
- if app.ENABLE_DRAGON_SOUL_SYSTEM:
- AFFECT_DATA_DICT[chr.NEW_AFFECT_DRAGON_SOUL_DECK1] = (localeInfo.TOOLTIP_DRAGON_SOUL_DECK1, "d:/ymir work/"+constInfo.GetUI()+"/dragonsoul/buff_ds_sky1.tga")
- AFFECT_DATA_DICT[chr.NEW_AFFECT_DRAGON_SOUL_DECK2] = (localeInfo.TOOLTIP_DRAGON_SOUL_DECK2, "d:/ymir work/"+constInfo.GetUI()+"/dragonsoul/buff_ds_land1.tga")
- if (app.ENABLE_AFFECT_POLYMORPH_REMOVE):
- AFFECT_DATA_DICT[chr.NEW_AFFECT_POLYMORPH] = (localeInfo.POLYMORPH_AFFECT_TOOLTIP, "d:/ymir work/"+constInfo.GetUI()+"/polymorph_marble_icon.tga")
- AFFECT_DATA_DICT[chr.AFFECT_ENERGY_1] = (localeInfo.TOOLTIP_AFFECT_ENERGY_1, "icon/item/blend_affect/50827.tga")
- if app.ENABLE_NEW_AFFECT_POTION:
- for i in xrange(len(mainAffectPotion["affect"])):
- AFFECT_DATA_DICT[mainAffectPotion["affect"][i]] = (mainAffectPotion["desc"][i], mainAffectPotion["image"][i])
- def __init__(self):
- ui.Window.__init__(self)
- self.serverPlayTime=0
- self.clientPlayTime=0
- if app.ENABLE_TARGET_AFFECT:
- self.ignoreCheck = False
- self.lastUpdateTime=0
- self.affectImageDict={}
- self.horseImage=None
- self.lovePointImage=None
- self.autoPotionImageHP = AutoPotionImage()
- self.autoPotionImageSP = AutoPotionImage()
- self.SetPosition(10, 10)
- self.Show()
- def ClearAllAffects(self):
- self.horseImage=None
- self.lovePointImage=None
- self.affectImageDict={}
- self.__ArrangeImageList()
- def ClearAffects(self):
- self.living_affectImageDict={}
- for key, image in self.affectImageDict.items():
- if not image.IsSkillAffect():
- self.living_affectImageDict[key] = image
- if app.ENABLE_TARGET_AFFECT:
- for aff in self.affectImageDict:
- self.affectImageDict[aff].Hide()
- self.affectImageDict = self.living_affectImageDict
- self.__ArrangeImageList()
- def BINARY_NEW_AddAffect(self, type, pointIdx, value, duration):
- print "BINARY_NEW_AddAffect", type, pointIdx, value, duration
- self.NEW_AFFECT_LIST = []
- if (app.ENABLE_NEW_AFFECT_POTION):
- self.NEW_AFFECT_LIST = mainAffectPotion["affect"][:] # Assigned the list [chr.AFFECT_POTION_1, chr.AFFECT_POTION_2 ......]
- if (app.ENABLE_AFFECT_POLYMORPH_REMOVE):
- self.NEW_AFFECT_LIST.append(chr.NEW_AFFECT_POLYMORPH) # += chr.NEW_AFFECT_POLYMORPH if is enabled.
- if type < 500 and not type in self.NEW_AFFECT_LIST and not self.ignoreCheck:
- return
- if type == chr.NEW_AFFECT_MALL:
- affect = self.MALL_DESC_IDX_START + pointIdx
- else:
- affect = type
- if self.affectImageDict.has_key(affect):
- return
- if not self.AFFECT_DATA_DICT.has_key(affect):
- if not self.ignoreCheck:
- return
- if affect == chr.NEW_AFFECT_NO_DEATH_PENALTY or\
- affect == chr.NEW_AFFECT_SKILL_BOOK_BONUS or\
- affect == chr.NEW_AFFECT_AUTO_SP_RECOVERY or\
- affect == chr.NEW_AFFECT_AUTO_HP_RECOVERY or\
- affect == chr.NEW_AFFECT_SKILL_BOOK_NO_DELAY:
- duration = 0
- affectData = self.AFFECT_DATA_DICT[affect]
- description = affectData[0]
- filename = affectData[1]
- if pointIdx == player.POINT_MALL_ITEMBONUS or\
- pointIdx == player.POINT_MALL_GOLDBONUS:
- value = 1 + float(value) / 100.0
- trashValue = 123
- if trashValue == 1:
- try:
- image = None
- if affect == chr.NEW_AFFECT_AUTO_SP_RECOVERY:
- image.SetPotionType(player.AUTO_POTION_TYPE_SP)
- image = self.autoPotionImageSP
- else:
- image.SetPotionType(player.AUTO_POTION_TYPE_HP)
- image = self.autoPotionImageHP
- image.SetParent(self)
- image.Show()
- image.OnUpdateAutoPotionImage()
- self.affectImageDict[affect] = image
- self.__ArrangeImageList()
- except Exception, e:
- print "except Aff auto potion affect ", e
- pass
- else:
- if affect != chr.NEW_AFFECT_AUTO_SP_RECOVERY and affect != chr.NEW_AFFECT_AUTO_HP_RECOVERY:
- if app.ENABLE_TARGET_AFFECT:
- if callable(description):
- description = description(float(value))
- else:
- description = description(float(value))
- try:
- print "Add affect %s" % affect
- image = AffectImage()
- image.SetParent(self)
- image.LoadImage(filename)
- image.SetDescription(description)
- image.SetDuration(duration)
- image.SetAffect(affect)
- if affect == chr.NEW_AFFECT_EXP_BONUS_EURO_FREE or\
- affect == chr.NEW_AFFECT_EXP_BONUS_EURO_FREE_UNDER_15 or\
- self.INFINITE_AFFECT_DURATION < duration:
- image.SetClock(FALSE)
- image.UpdateDescription()
- elif affect == chr.NEW_AFFECT_AUTO_SP_RECOVERY or affect == chr.NEW_AFFECT_AUTO_HP_RECOVERY:
- image.UpdateAutoPotionDescription()
- else:
- image.UpdateDescription()
- if affect == chr.NEW_AFFECT_DRAGON_SOUL_DECK1 or affect == chr.NEW_AFFECT_DRAGON_SOUL_DECK2:
- image.SetScale(1, 1)
- else:
- image.SetScale(0.8, 0.8)
- image.SetSkillAffectFlag(FALSE)
- image.Show()
- import dbg
- dbg.TraceError("Add affect down [%d]" % (affect))
- self.affectImageDict[affect] = image
- self.__ArrangeImageList()
- except Exception, e:
- print "except Aff affect ", e
- pass
- def BINARY_NEW_RemoveAffect(self, type, pointIdx):
- if type == chr.NEW_AFFECT_MALL:
- affect = self.MALL_DESC_IDX_START + pointIdx
- else:
- affect = type
- print "Remove Affect %s %s" % ( type , pointIdx )
- self.__RemoveAffect(affect)
- self.__ArrangeImageList()
- def SetAffect(self, affect):
- self.__AppendAffect(affect)
- self.__ArrangeImageList()
- def ResetAffect(self, affect):
- self.__RemoveAffect(affect)
- self.__ArrangeImageList()
- def SetLoverInfo(self, name, lovePoint):
- image = LovePointImage()
- image.SetParent(self)
- image.SetLoverInfo(name, lovePoint)
- self.lovePointImage = image
- self.__ArrangeImageList()
- def ShowLoverState(self):
- if self.lovePointImage:
- self.lovePointImage.Show()
- self.__ArrangeImageList()
- def HideLoverState(self):
- if self.lovePointImage:
- self.lovePointImage.Hide()
- self.__ArrangeImageList()
- def ClearLoverState(self):
- self.lovePointImage = None
- self.__ArrangeImageList()
- def OnUpdateLovePoint(self, lovePoint):
- if self.lovePointImage:
- self.lovePointImage.OnUpdateLovePoint(lovePoint)
- def SetHorseState(self, level, health, battery):
- if level==0:
- self.horseImage=None
- else:
- image = HorseImage()
- image.SetParent(self)
- image.SetState(level, health, battery)
- image.Show()
- self.horseImage=image
- self.__ArrangeImageList()
- def SetPlayTime(self, playTime):
- self.serverPlayTime = playTime
- self.clientPlayTime = app.GetTime()
- if localeInfo.IsVIETNAM():
- image = PlayTimeImage()
- image.SetParent(self)
- image.SetPlayTime(playTime)
- image.Show()
- self.playTimeImage=image
- self.__ArrangeImageList()
- def __AppendAffect(self, affect):
- if self.affectImageDict.has_key(affect):
- return
- try:
- affectData = self.AFFECT_DATA_DICT[affect]
- except KeyError:
- return
- name = affectData[0]
- filename = affectData[1]
- skillIndex = player.AffectIndexToSkillIndex(affect)
- if 0 != skillIndex:
- name = skill.GetSkillName(skillIndex)
- image = AffectImage()
- image.SetParent(self)
- image.SetSkillAffectFlag(TRUE)
- try:
- image.LoadImage(filename)
- except:
- pass
- image.SetToolTipText(name, 0, 40)
- image.SetScale(0.8, 0.8)
- image.Show()
- self.affectImageDict[affect] = image
- def __RemoveAffect(self, affect):
- """
- if affect == chr.NEW_AFFECT_AUTO_SP_RECOVERY:
- self.autoPotionImageSP.Hide()
- if affect == chr.NEW_AFFECT_AUTO_HP_RECOVERY:
- self.autoPotionImageHP.Hide()
- """
- if not self.affectImageDict.has_key(affect):
- print "__RemoveAffect %s ( No Affect )" % affect
- return
- print "__RemoveAffect %s ( Affect )" % affect
- del self.affectImageDict[affect]
- self.__ArrangeImageList()
- def __ArrangeImageList(self):
- width = len(self.affectImageDict) * self.IMAGE_STEP
- if self.lovePointImage:
- width+=self.IMAGE_STEP
- if self.horseImage:
- width+=self.IMAGE_STEP
- self.SetSize(width, 26)
- xPos = 0
- if self.lovePointImage:
- if self.lovePointImage.IsShow():
- self.lovePointImage.SetPosition(xPos, 0)
- xPos += self.IMAGE_STEP
- if self.horseImage:
- self.horseImage.SetPosition(xPos, 0)
- xPos += self.IMAGE_STEP
- for image in self.affectImageDict.values():
- image.SetPosition(xPos, 0)
- xPos += self.IMAGE_STEP
- def OnUpdate(self):
- try:
- if app.ENABLE_TARGET_AFFECT:
- if app.GetGlobalTime() - self.lastUpdateTime > 500 or self.ignoreCheck:
- self.lastUpdateTime = app.GetGlobalTime()
- for image in self.affectImageDict.values():
- if image.GetAffect() == chr.NEW_AFFECT_AUTO_HP_RECOVERY or image.GetAffect() == chr.NEW_AFFECT_AUTO_SP_RECOVERY:
- image.UpdateAutoPotionDescription()
- continue
- if not image.IsSkillAffect():
- image.UpdateDescription()
- else:
- if app.GetGlobalTime() - self.lastUpdateTime > 500:
- self.lastUpdateTime = app.GetGlobalTime()
- for image in self.affectImageDict.values():
- if image.GetAffect() == chr.NEW_AFFECT_AUTO_HP_RECOVERY or image.GetAffect() == chr.NEW_AFFECT_AUTO_SP_RECOVERY:
- image.UpdateAutoPotionDescription()
- continue
- if not image.IsSkillAffect():
- image.UpdateDescription()
- except Exception, e:
- print "AffectShower::OnUpdate error : ", e
Ich hoffe es kann mir da einer helfen?
Vielen dank im Vorraus!
-
Hallo,
ich versuche vergeblich den Onlinestatus für mein eigenes Interface auszulesen. Bei der originalen loginwindow.py wird ja in eine listbox geaddet.
Nun habe ich aber keine Listbox mehr sondern möchte 4 texte updaten die auch in der uiscript vom loginwindow.py vorhanden sind. Ich nutze auch nicht mehr die serverInfo.py.
Hat da jemand erfahrung?
Mit freundlichen Grüßen
-
Wenn wir gerade dabei sind, wie kann man denn die akumulation richtig ermitteln? Gibt es da einen richtigen anhaltspunkt um den wert richtig zu ermitteln?
-
Einfach aus dem Grund weil du mit absicht mein Run komplett nachbaust. Sogar diese Truhe steht hinter Holzstämmen. Die überschriften sind gleich auf einmal alle 5 Runden belohnungen usw.? Das ist das Problem.
Reg dich nicht auf. Da kannste eh nichts gegen machen und musste drueber stehen.
Ueberleg dir doch lieber, wie du das Free System wieder ueberbietest und schreib in deinen Thread, was dein System fuer nen Mehrwert bietet.
Ob CYN3 da soviel Zeit hat da immer aktuell hinterher zu sein?
Einige ideen hätte ich noch, allerdings habe auch ich nicht genug zeit und vorallem lust mir mit sojemanden einen wettlauf zu bieten dessen einzige erfolge es sind anderen schaden zuzufügen. Ich habe aber schon mit sowas gerechnet.
-
Einfach aus dem Grund weil du mit absicht mein Run komplett nachbaust. Sogar diese Truhe steht hinter Holzstämmen. Die überschriften sind gleich auf einmal alle 5 Runden belohnungen usw.? Das ist das Problem.
-
Es ist aber immer wieder schön zu sehen wie ekelig die Mt2 Community ist. Alles nachzubauen wie in meinem Run und dann als "seins" ausgeben. So macht man sich sicher keine guten freunde Richtig raffgierige Community. Bau dir was eigenes mit einer eigenen Idee und verkauf es, ich verstehe so Leute wie dich nicht.