Informationen aus Statistikmenu nutzen
» Siedler Map Source Forum » Siedler DEdK Script Forum » Informationen aus Statistikmenu nutzen
Seiten: 1 2 Nächste Seite
totalwarANGEL
|
#1 15.12.2009 21:46 Beiträge: 2123 |
Informationen aus Statistikmenu nutzen
So, nachdem mir mit den Steuern geholfen wurde, stieß ich auf die nächste Grenze.
Gibt es eine Möglichkeit bspw. die besiegten Gegnereinheiten und die eigenen Verluste als Zahlenwert für eine Varriable zu bekommen?
Also in der Form: LostUnits = ... -- Funktion die benörigt wird KilledEnemy = ... -- Funktion die benötigt wird
Die Varriabelen müssen nicht so heißen.
ich zittere schon vor freude auf die antwort
____________________
Die Welt ist arschlochförmig und wir leben in der Mitte.
Dieser Beitrag wurde von totalwarANGEL am 16.12.2009 um 11:49 editiert.
Kalle
|
#2 16.12.2009 14:45 Beiträge: 1150 |
Eine interesante Frage:
... nur leider habe ich auch keinen Lösungsansatz. Vielleicht aus den GUI-Hack, da gäbe es doch StatisticsWindow_SelectStatistics, oder?
____________________
Lieber Siedeln statt (fern)sehen.....
totalwarANGEL
|
#3 16.12.2009 17:52 Beiträge: 2123 |
Zitat von Kalle:
Vielleicht aus den GUI-Hack, da gäbe es doch StatisticsWindow_SelectStatistics, oder?
welche Parameter het diese Funktion?
____________________
Die Welt ist arschlochförmig und wir leben in der Mitte.
Kalle
|
#4 16.12.2009 18:48 Beiträge: 1150 |
dazu fällt mir nur Noigi's "Hack" ein....
Zitat von Noigi:
GUICreateSoldiersForLeader_Orig = GUI.BuySoldier; GUI.BuySoldier = function(...) Message("Anzahl Parameter: "..table.getn(arg)) local v = {GUICreateSoldiersForLeader_Orig(unpack(arg))}; Message("Anzahl Rückgabewerte: "..table.getn(v)); return unpack(v); end
Das hier ist der Hack einer GUI-Funktion, den Aufbau kann man auch für jede andere Funktionen benutzen. Wenn du das Glück hast und die Funktion intern verwendet wird, kriegst du die Anzahl der Parameter und Rückgabewerte ausgegeben. Dann kann man gezielter nachfragen. Bei 2 Parametern und 1 Rückgabewert zB so:
GUICreateSoldiersForLeader_Orig = GUI.BuySoldier; GUI.BuySoldier = function(a,b) Message("Parameter: "..type(a).." / "..type(b)) local v = GUICreateSoldiersForLeader_Orig(a,b); Message("Rückgabewert: "..type(v)); return v; end
Wenn man type() weglässt, werden die tatsächlichen Inhalte ausgegeben, aber natürlich nur bei string und number-Werten
Der Rest bedeutet nun, viel probieren....
____________________
Lieber Siedeln statt (fern)sehen.....
totalwarANGEL
|
#5 16.12.2009 19:34 Beiträge: 2123 |
Zitat von Kalle:
Der Rest bedeutet nun, viel probieren....
toll. jetzt muss ich erst mal raffen was diese funktion tut
ich bekomme immer die meldung:
[ 2009/12/16 20:18:50 ] ERROR: DEBUG ERROR! Error: LUA_ERRRUN: [string "C:\Users\Nutzer\Documents\DIE SIEDLER - DEd..."]:30: attempt to call global `Check' (a nil value)
____________________
Die Welt ist arschlochförmig und wir leben in der Mitte.
Dieser Beitrag wurde von totalwarANGEL am 16.12.2009 um 20:19 editiert.
Noigi
|
#6 16.12.2009 20:19 Beiträge: 772 |
"StatisticsWindow_SelectStatistics" ist mit großer Wahrscheinlichkeit ein Button-Callback; also eine Funktion, kein table mit Informationen.
Um das genau herauszufinden müsste man wie Kalle richtig beschrieben hat die internen Aufrufe abfangen.
Ich habe den _G mal grob überflogen und nichts gefunden, das wie ein Speichertable für die Statistik-Daten aussieht. "Score" enthält scheinbar die erreichten Punkte pro Statistik-Kategorie, aber nicht die Daten selber.
Eine Alternative zur Verwendung internen Daten wäre, die Daten selbst zu sammeln:
Trigger.RequestTrigger( Events.LOGIC_EVENT_ENTITY_DESTROYED, "", "Verwaltung_der_Todesfaelle", 1);
In der Funktion "Verwaltung_der_Todesfaelle" müssten dann playerID und Entity-Typ (->nur Einheiten) der zerstörten Entities abgefragt werden, und bei Treffern entsprechende Zählvariablen erhöht werden.
Wenn der Trigger von Anfang an läuft, sollte er auf ähnliche Werte kommen wie die internen Statistik-Daten. Allerdings natürlich ne Ecke aufwändiger.
totalwarANGEL
|
#7 16.12.2009 20:26 Beiträge: 2123 |
Zitat von Noigi:
Eine Alternative zur Verwendung internen Daten wäre, die Daten selbst zu sammeln:
Trigger.RequestTrigger( Events.LOGIC_EVENT_ENTITY_DESTROYED, "", "Verwaltung_der_Todesfaelle", 1);
In der Funktion "Verwaltung_der_Todesfaelle" müssten dann playerID und Entity-Typ (->nur Einheiten) der zerstörten Entities abgefragt werden, und bei Treffern entsprechende Zählvariablen erhöht werden.
Wenn der Trigger von Anfang an läuft, sollte er auf ähnliche Werte kommen wie die internen Statistik-Daten. Allerdings natürlich ne Ecke aufwändiger.
aha. also für jede einheit die der/die gegner haben können.
jetzt brauch ich nur noch ein muster wie die funktion geschrieben werden muss. oda geht das mit funktion()... end? brauch ich dafür comfort-funktionen?
____________________
Die Welt ist arschlochförmig und wir leben in der Mitte.
Dieser Beitrag wurde von totalwarANGEL am 16.12.2009 um 20:36 editiert.
totalwarANGEL
|
#8 16.12.2009 20:53 Beiträge: 2123 |
Die Lösung gefunden?
kann es seien das die lösung in diesem beitrag steckt:
http://www.siedler-portal.de/s...25-erfassen-von-vorg-ngen.html
oda nicht?
____________________
Die Welt ist arschlochförmig und wir leben in der Mitte.
Noigi
|
#9 16.12.2009 21:13 Beiträge: 772 |
Ja, genau das Prinzip meine ich.
Willst du knobeln?
Wenn ja, nicht weiterlesen!
.
.
.
.
function Verwaltung_der_Todesfaelle() local kaputt = Event.GetEntityID(); -- hier wird die gerade zerstörte Entity erfasst if (Logic.IsEntityInCategory(kaputt,EntityCategories.Military) == 1) then -- eine Einheit! if GetPlayer(kaputt) == 1 then VerloreneEinheiten = ((VerloreneEinheiten or 0) +1); elseif GetPlayer(kaputt) == 2 then -- GegnerID 2 BesiegteEinheiten = ((BesiegteEinheiten or 0) +1); end end end
Ein Manko hat das Ganze: Es werden auch Einheiten erfasst, die nur entlassen oder vom Skript zerstört werden.
totalwarANGEL
|
#10 16.12.2009 21:30 Beiträge: 2123 |
Zitat von Noigi:
function Verwaltung_der_Todesfaelle() local kaputt = Event.GetEntityID(); -- hier wird die gerade zerstörte Entity erfasst if (Logic.IsEntityInCategory(kaputt,EntityCategories.Military) == 1) then -- eine Einheit! if GetPlayer(kaputt) == 1 then VerloreneEinheiten = ((VerloreneEinheiten or 0) +1); elseif GetPlayer(kaputt) == 2 then -- GegnerID 2 BesiegteEinheiten = ((BesiegteEinheiten or 0) +1); end end end
Ein Manko hat das Ganze: Es werden auch Einheiten erfasst, die nur entlassen oder vom Skript zerstört werden.
und und vorher das:
Trigger.RequestTrigger( Events.LOGIC_EVENT_ENTITY_DESTROYED, "", "Verwaltung_der_Todesfaelle", 1);
für die sache mit dem entlassen müsste was gefunden werden mit dem man die klicks auf entlassen zählt...
____________________
Die Welt ist arschlochförmig und wir leben in der Mitte.
totalwarANGEL
|
#11 17.12.2009 18:42 Beiträge: 2123 |
Geschafft
function Verwaltung_der_Todesfaelle2() GUIAction_ExpelSettler_Orig = GUIAction_ExpelSettler GUIAction_ExpelSettler = function() GUIAction_ExpelSettler_Orig() EntlasseneEinheiten = EntlasseneEinheiten + 1 end end
Habe es hinbekommen. diese Funktion scheint alle Klicks auf "Entlassen" zu zählen. die ziehe ich dann von "Verlorene Einheiten" ab. Danke Noigi und Kalle, für Vorschläge und Hilfe.
____________________
Die Welt ist arschlochförmig und wir leben in der Mitte.
Kalle
|
#12 18.12.2009 12:47 Beiträge: 1150 |
.. also, ich habe mal ein wenig probiert...
wenn ich nutze:
GUI.StatisticsWindow_SelectStatistics = function(a,b,c,d)
Message ("gui startet" )
Message("Parameter: "..type(a).." / "..type(b))
Message ("nummer von a "..a)
end
... dann bekomme ich für jede Statistik einen nummerischen Wert. Aber was mache ich mit der Nummer (zB ich glaube 30 war für gebaute Wohnungen) ? Wie komme ich nun an das Ergebnis dieser Statistik? Dann könnte man die gewünschten Statistiken direkt im Spiel übernehmen....
Scheinbar sind die Statistiken durchnumeriert. Jetzt müsste man zb den Namen des Table wissen, um nach dem Ergebnis von table(zb30) zu fragen (in der Hoffnung, dort steht die Summe der gewünschten Statistik).
Vielleicht hat noch einer eine Idee? Ich probiere auf jeden Fall mal weiter....
____________________
Lieber Siedeln statt (fern)sehen.....
totalwarANGEL
|
#13 21.12.2009 13:44 Beiträge: 2123 |
Zitat von Kalle:
Vielleicht hat noch einer eine Idee? Ich probiere auf jeden Fall mal weiter
Statistics_SubHouses_all Calls: GUI.StatisticsWindow_SelectStatistics(30) Statistics_SubHouses_Farms Calls: GUI.StatisticsWindow_SelectStatistics(31) Statistics_SubHouses_Residences Calls: GUI.StatisticsWindow_SelectStatistics(32) Statistics_SubHouses_Workers Calls: GUI.StatisticsWindow_SelectStatistics(33)
vllt. sind es ja diese nummern hier.
____________________
Die Welt ist arschlochförmig und wir leben in der Mitte.
Kalle
|
#14 23.12.2009 17:37 Beiträge: 1150 |
jau, aber wie bekomme ich den Wert zurück, den er oben rechts auf dem Screen ausgibt?
wert = GUI.StatisticsWindow_SelectStatistics hat mir nichts gegeben...
____________________
Lieber Siedeln statt (fern)sehen.....
Noigi
|
#15 23.12.2009 21:15 Beiträge: 772 |
Es handelt sich bei GUI.StatisticsWindow_SelectStatistics ja wie erwartet um eine "oberflächliche" GUI-Funktion, die bloß die Anzeige der Untermenüs im Statistikfenster steuert - aus ihr kannst du auch mit vorgehaltener Pistole keine Statistik-Infos herausholen.
Es müsste wenn dann einen globalen table geben, der die Daten enthält; aber wie gesagt glaube ich, dass sie gar nicht auf Skriptbasis gespeichert werden, sondern vom Spiel selbst. In dem Fall keine Chance, dranzukommen.
Kalle
|
#16 23.12.2009 22:21 Beiträge: 1150 |
... mist..., aber trotzdem Danke für den niederschmetternden Hinweis....
____________________
Lieber Siedeln statt (fern)sehen.....
totalwarANGEL
|
#17 08.11.2010 18:51 Beiträge: 2123 |
Gesammte Statistik bekommen
Sorry, wenn ich diese Leiche hier nochmal schände
Konnte man nicht irgend wie die gesamte Statistik als Wert bekommen, oder irre ich mich?
____________________
Die Welt ist arschlochförmig und wir leben in der Mitte.
Noigi
|
#18 08.11.2010 21:38 Beiträge: 772 |
Eine sehr umständliche Möglichkeit könnte es sein, mit Skriptaufrufen das Statistikfenster selbst einzublenden, die passende "Select"-Funktion aufzurufen (so dass die richtige Ansicht angezeigt wird), und dann den gesuchten Wert per XGUIEng.GetText() auszulesen. Danach das Statistikfenster dann wieder ausblenden. Ich weiß jetzt aber nicht genau, welchen konkreten Wert du haben willst, und ob der überhaupt in einem Widget ausgegeben wird, das man mit XGUIEng.GetText() auslesen kann.
Mordred
|
#19 08.11.2010 22:29 Beiträge: 939 |
Tja, da wirds kompliziert
Die Todesfälle abfangen wird noch schwieriger, da du ja noch wissen müsstest, welcher Spieler das Opfer umgebracht hat, und dann auch noch, wie die Spieler zueinander stehen...
Das Entlassen:
GUIAction_ExpelSettlerTodesfaelle = GUIAction_ExpelSettler function GUIAction_ExpelSettler() local tot = GUI.GetSelectedEntitiy() -- was du machen willst, z.B. eine Variable GUIAction_ExpelSettlerTodesfaelle() end
Im _G-Table steht noch lange nicht alles.
Z.B. nicht das Table mit den Jobs oder sonstige kleine Teilfunktionen wie in RemoveEntityInFog usw, was man erst mit der Funktionen-einlesen-Funktion findet.
Oder durch ein paar Rechtschreibfehler: ERROR! a nil value!, was ich teilweise ausgebessert habe...
Ist aber schwer.
Wenn dein PC wieder fit ist, kannst du dich ja mal da dran machen
LG Mordred
Dieser Beitrag wurde von Mordred am 08.11.2010 um 22:34 editiert.
Anarki
|
#20 09.11.2010 00:52 Beiträge: 518 |
Tja, getötete und verlorene Einheiten, das alte Dilemma!
Die Werte hätte ich für meine Statistikausgabe in meinen Multiplayercomfort-Maps auch gern gehabt...
Die Sache mit GUI GetText auslesen klingt eigentlich ganz vielversprechend? Naja, eigentlich aber auch nur
Also mit getöteten Einheiten kann ich nicht helfen... Anzahl Soldaten, Schlafplätzen, Essplätzen... da kann ich vlt. doch helfen (aber auch nur bedingt... Diebe und Spione hab ich nämlich einfach mal nicht beachtet)
GetNumberOfSoldiers = function() local _nr = {0,0,0,0,0,0,0,0} for _pId = 1,8 do _nr[_pId] = Logic.GetNumberOfAttractedSoldiers(_pId) end return _nr end GetNumberOfSerfs = function() local _nr = {0,0,0,0,0,0,0,0} for _pId = 1,8 do _nr[_pId] = Logic.GetNumberOfEntitiesOfTypeOfPlayer(_pId, Entities.PU_Serf) end return _nr end GetNumberOfSettlers = function() local _nr = {0,0,0,0,0,0,0,0} for _pId = 1,8 do _nr[_pId] = Logic.GetNumberOfAttractedSettlers(_pId) end return _nr end GetNumberOfWorkerWithoutEatPlace = function() local _nr = {0,0,0,0,0,0,0,0} for _pId = 1,8 do _nr[_pId] = Logic.GetNumberOfWorkerWithoutEatPlace(_pId) end return _nr end GetNumberOfWorkerWithoutSleepPlace = function() local _nr = {0,0,0,0,0,0,0,0} for _pId = 1,8 do _nr[_pId] = Logic.GetNumberOfWorkerWithoutSleepPlace(_pId) end return _nr end
____________________
Siedler V Tool: Selbstextrahierende Maps erstellen
Bitte testen und kommentieren
totalwarANGEL
|
#21 09.11.2010 16:24 Beiträge: 2123 |
Eigene Messungen
Anscheinend sind eigene essungen nötig. Das bietet aber auch Potenzial für eigene Kreativitzät
____________________
Die Welt ist arschlochförmig und wir leben in der Mitte.
Mordred
|
#22 09.11.2010 16:39 Beiträge: 939 |
Ich sehe mal, ob sich aus den Funktionen eine Variable rausbekommen lässt, sonst ist wirklich Kreativität angesagt
Kalle
|
#23 18.03.2011 17:47 Beiträge: 1150 |
Gibt es hierzu neue Erkentnisse ? Die könnte ich gerade sehr gut gebrauchen !!!
Danke
____________________
Lieber Siedeln statt (fern)sehen.....
totalwarANGEL
|
#24 18.03.2011 18:09 Beiträge: 2123 |
Zitat von Kalle:
Gibt es hierzu neue Erkentnisse ? Die könnte ich gerade sehr gut gebrauchen !!!
Von meiner Seite gibts nix neues.
____________________
Die Welt ist arschlochförmig und wir leben in der Mitte.
Anarki
|
#25 24.03.2011 10:08 Beiträge: 518 |
Zitat von totalwarANGEL:
Sorry, wenn ich diese Leiche hier nochmal schände
Konnte man nicht irgend wie die gesamte Statistik als Wert bekommen, oder irre ich mich?
Table: Score
BattleBuildingPoints
BattleSettlersPoints
CallBackGameWon
CallBackResearched
CallBackUpgrade
ConstructionPoints
GetPlayerScore
GetTeamScore
OnBuildingConstructionComplete
Player
ResearchPoints
ResourcePoints
SettlersPoints
UpgradePoints
WinPoints
Also mal probieren mit Score.BattleBuildingsPoints[pID]
etc - und einfach alles addieren was benötigt ist für die "Gesamtpunkte"
Zitat von Kalle:
Gibt es hierzu neue Erkentnisse ? Die könnte ich gerade sehr gut gebrauchen !!!
Ne, nix gemacht.
Aber um zum Ursprungspost zurückzukehren:
- Erledigte Feinde
- Verlorene Einheiten
Es gibt den Trigger "OnEntityHurt" - dazu bekommt man die EntityIDs und daraus die SpielerIDs!! Ein kleiner Check ob die Entity danach hinüber ist reicht - dazu könnte man die EntityID in einen Table legen und über einen HiResJob auf "IsDead" checken - und "falls nicht tod" wieder aus dem Table werfen(?)
Hier ein Beispiel mit aktiviertem Trigger aus meiner "TowerFight Map"
Hier gibt es ein Hauptquartier, das
a) nur jede Sekunde einmal Schaden nehmen kann
b) also Unverwundbar ist während 2 Angriffen die kürzer als 1 Sekunde sind
c) und ausserdem nur einen fixen Wert an Schaden nimmt, egal welche Einheit.
Mehr zu den Triggern hier:
Glossary:Auslöser
function ActionOnEntityHurt() local attacker = Event.GetEntityID1() --Angreifer local hurt = Event.GetEntityID2() --Angriffsziel if Track_Entity_Table[1][Entities.CB_DarkCastle][1] == hurt then MakeInvulnerable(hurt) DamageHeadQuartersTable[1] = true end if Track_Entity_Table[5][Entities.CB_DarkCastle][1] == hurt then MakeInvulnerable(hurt) DamageHeadQuartersTable[2] = true end end function DamageHeadQuarters() if DamageHeadQuartersTable[1] then MakeVulnerable(Track_Entity_Table[1][Entities.CB_DarkCastle][1]) SetHealth(Track_Entity_Table[1][Entities.CB_DarkCastle][1],GetHealth(Track_Entity_Table[1][Entities.CB_DarkCastle][1])-0.08) DamageHeadQuartersTable[1] = false if IsDead(Track_Entity_Table[1][Entities.CB_DarkCastle][1]) then for _pId = 1,4 do for i = Track_Entity_Table[_pId][Entities.PB_Barracks2].count, 1, -1 do MakeVulnerable( Track_Entity_Table[_pId][Entities.PB_Barracks2][i] ) DestroyEntity(Track_Entity_Table[_pId][Entities.PB_Barracks2][i]) end for i = Track_Entity_Table[_pId][Entities.PB_Archery2].count, 1, -1 do MakeVulnerable( Track_Entity_Table[_pId][Entities.PB_Archery2][i] ) DestroyEntity(Track_Entity_Table[_pId][Entities.PB_Archery2][i]) end end end end if DamageHeadQuartersTable[2] then MakeVulnerable(Track_Entity_Table[5][Entities.CB_DarkCastle][1]) SetHealth(Track_Entity_Table[5][Entities.CB_DarkCastle][1],GetHealth(Track_Entity_Table[5][Entities.CB_DarkCastle][1])-0.08) DamageHeadQuartersTable[2] = false if IsDead(Track_Entity_Table[5][Entities.CB_DarkCastle][1]) then for _pId = 5,8 do for i = Track_Entity_Table[_pId][Entities.PB_Barracks2].count, 1, -1 do MakeVulnerable( Track_Entity_Table[_pId][Entities.PB_Barracks2][i] ) DestroyEntity(Track_Entity_Table[_pId][Entities.PB_Barracks2][i]) end for i = Track_Entity_Table[_pId][Entities.PB_Archery2].count, 1, -1 do MakeVulnerable( Track_Entity_Table[_pId][Entities.PB_Archery2][i] ) DestroyEntity(Track_Entity_Table[_pId][Entities.PB_Archery2][i]) end end end end end function GetHealth( _entity ) local entityID = GetEntityId( _entity ); if not Tools.IsEntityAlive( entityID ) then return 0; end local MaxHealth = Logic.GetEntityMaxHealth( entityID ); local Health = Logic.GetEntityHealth( entityID ); return ( Health / MaxHealth ) * 100 end
____________________
Siedler V Tool: Selbstextrahierende Maps erstellen
Bitte testen und kommentieren
Seiten: 1 2 Nächste Seite