.....
Blogs
.....
Geändert von Sokrates (06.12.2008 um 23:48 Uhr)
Für den Weisen bedeutet jeder Tag ein neues Leben.
Hi,
ist eine KI für diese PlayerID aktiviert?
Oder mal mit
probieren.Code:AICore.SetNumericalFact( AIPlayerID, "BARB", 1 )
Oder evt. funktioniert (lokal):
Gruß GuntherCode:GUI.SetRepairAlarm(Logic.GetHeadquarters(_PlayerID), true)
PS: Wissen tu ich es aber auch nicht - die KI das "unbekannte Wesen", da ist alles möglich.![]()
Intern werden nur NPC-Dörfer korrekt abgefangen, sodass der Feueralarm aktiviert wird. Du musst Dir das also selbst schreiben, oder dem Spieler ein NPC-Lagerhaus hinsetzen.
Am besten packst Du das in Mission_CallBack_OnBuildingBurning(_player, _entity).
@Netsurfer Es ist für das >>Reparier<<-Verhalten völlig irrelevant, ob es eine KI gibt - das ist nur entscheidend für das >>Wiederaufbau<<-Verhalten.
@Old McDonald: Feueralarm und Reparaturalarm sind aber auch zwei veerschiedene Paar Schuhe!
Ah, also ist Reparatur ~= Wiederaufbau. Hatte angenommen, dass Wiederaufbau = Reparatur (von 0) ist.@Netsurfer Es ist für das >>Reparier<<-Verhalten völlig irrelevant, ob es eine KI gibt - das ist nur entscheidend für das >>Wiederaufbau<<-Verhalten.
Wieder was gelernt - danke!
Gruß
Gunther
Hmm - jetzt muss ich noch einmal überlegen... Wird der Feueralarm direkt in einen aktiven Reparaturalarm umgewandelt? Ich glaube es zumindest mal.
Ginge es nur darum, den Reparaturalarm zu aktivieren, ginge das auch mit Logic.SetRepairAlarm().
Arbeitergebäude werden automatisch repariert, aber Lagerhäuser, Burgen und ähnliches werden eben nicht automatisch nach Skriptevents (Erdbeben) auch bei KIs repariert. Von dem her glaube ich einfach mal, dass der Feueralarm den Reparaturalarm nach sich zieht.
Geändert von Old McDonald (31.07.2008 um 16:11 Uhr)
Ja, aber muss denn jede Form der Zerstörung automatisch mit einem Feuer (denn nur dann wäre ja der Feueralarm von Nöten) einhergehen? Oder anders gefragt: Ist bei einem KI-Spieler das vorherige Löschen vor einer Reparatur unbedingt erforderlich, oder ginge das Feuer nicht bei der Reparatur eh von alleine aus?
Ich glaube, dass meine Code-Zeile auch genau das bewirkt - nur halt aus der lokalen Umgebung heraus (an die bin ich halt momentan so gewöhntGinge es nur darum, den Reparaturalarm zu aktivieren, ginge das auch mit Logic.SetRepairAlarm().)
Ja, bei Player 1 ist das so. Wenn das Feuer gelöscht ist, verwandelt sich der Feueralarm-Button in einen Reparaturalarm-Button. Nur setzt das ja das vorherige Anklicken des Buttons voraus, was in Sokrates Fall ja nicht möglich/ erforderlich ist.Arbeitergebäude werden automatisch repariert, aber Lagerhäuser, Burgen und ähnliches werden eben nicht automatisch nach Skriptevents (Erdbeben) auch bei KIs repariert. Von dem her glaube ich einfach mal, dass der Feueralarm den Reparaturalarm nach sich zieht.
Gruß
Gunther
Wenn Sokrates von einem Angriff spricht, müsste Mission_CallBack_OnBuildingBurning() normalerweise aufgerufen werden...
Das ginge dann in etwa so:
Und falls das Gebäude nicht brennen sollte - dann Mission_Callback_EntityHurt().Code:function Mission_CallBack_OnBuildingBurning(_player, _entity) if AIPlayerTable[_player] and Logic.CanFireAlarmBeActivated(_entity) and not Logic.IsFireAlarmActiveAtBuilding(_entity) then Logic.BuildingSetFireAlarm(_entity, true); end end
Relativ gleich, nur mehr Checks:
Aber überhaupt nicht getestet...Code:function Mission_Callback_EntityHurt(_entity, _player) if Logic.GetEntityHealth(_entity) > 0 and Logic.IsBuilding(_entity) == 1 and Logic.IsConstructionComplete(_entity) == 1 and AIPlayerTable[_player] then if not Logic.IsBurning(_entity) and Logic.CanRepairAlarmBeActivated(_entity) and not Logic.IsRepairAlarmActiveAtBuilding(_entity) then Logic.SetRepairAlarm(_entity, true); end end end
Hi
Danke..
Ich habe die Situation unterdessen anderweitig gelöst. Mit einem Protect Quest auf das Hauptquartier wird die Reparatur ausgeführt.
Werde den Code aber trotzdem mal testen.Gibt sicher wieder mal ne Situation wo möglicherweise dieses Problem auftritt.
Gruss Sokrates
Für den Weisen bedeutet jeder Tag ein neues Leben.
Meine aktuelle Lösung:
Die jetztige Lösung die ich auch in meiner letzten Map verwende, scheint mir im Moment das einfachste!
Code:function Lib_RepairMainBuilding(_terrID, _player) local entities = {Logic.GetEntitiesOfCategoryInTerritory(_terrID, _player, EntityCategories.Cathedrals, 0)} if #entities > 0 then local maxhealth = Logic.GetEntityMaxHealth( entities[1] ) Logic.HealEntity(entities[1], maxhealth) end local entities = {Logic.GetEntitiesOfCategoryInTerritory(_terrID, _player, EntityCategories.Headquarters, 0)} if #entities > 0 then local maxhealth = Logic.GetEntityMaxHealth( entities[1] ) Logic.HealEntity(entities[1], maxhealth) end local entities = {Logic.GetEntitiesOfCategoryInTerritory(_terrID, _player, EntityCategories.Storehouse, 0)} if #entities > 0 then local maxhealth = Logic.GetEntityMaxHealth( entities[1] ) Logic.HealEntity(entities[1], maxhealth) end endMit dieser Funktion werden automatisch alle Hauptgebäude eines Spielers repariert.
Gruss Sokrates
Für den Weisen bedeutet jeder Tag ein neues Leben.
Hi,
nur ganz schnell zwischen Tür & Angel.
Normalerweise hat doch jeder Spieler von diesen Gebäuden jeweils nur eins. Warum also dann jedes Mal die recht "aufwendige" Suche nach diesen Entitäten?
Wäre doch einfacher und performanter, diese nur einmal in ein globales Table einzulesen, und in der Funktion höchstens noch zu prüfen, ob die Entität noch existiert.
Stichworte:
Logic.IsEntityAlive / Logic.IsEntityDestroyed
Logic.GetStoreHouse(_PlayerID)
Logic.GetHeadquarters(_PlayerID)
Logic.GetCathedral(_PlayerID) / Logic.GetCathedralID(_PlayerID)
Gruß
Gunther
Hi Gunther
Hier ein neuer Versuch. Würde dies genügen?
Habe es getestet und funktioniert einwandfrei...Code:function Lib_RepairMainBuilding(_player) local build = { Logic.GetStoreHouse, Logic.GetHeadquarters, Logic.GetCathedral } for i = 1, 3 do local entity = build[i](_player) if entity > 0 then local maxhealth = Logic.GetEntityMaxHealth( entity ) Logic.HealEntity(entity, maxhealth) end end end
Gruss Sokrates
Geändert von Sokrates (12.08.2008 um 01:16 Uhr) Grund: Neuer Versuch!
Für den Weisen bedeutet jeder Tag ein neues Leben.
Hatte auch das Problem, das eine Stadt zu leicht abgefackelt wurde, habe es so gelöst.
Code:StartSimpleJobEx(HealSpecialBuildings, 6, 6, Entities.B_Castle_NA)Der _castletyp wurde eingebaut, weil auf der Map verschiedene Burgtypen vorhanden sind.Code:function HealSpecialBuildings(_territory, _player, _castletyp) local EntitiesToHeal = {Entities.B_StoreHouse, _castletyp, Entities.B_Cathedral} local Data = {Logic.GetEntitiesOfCategoryInTerritory(_territory, _player, EntityCategories.SpecialBuilding, 0)} for i = #Data, 1, -1 do for j = 1, #EntitiesToHeal do GetEntityId(EntitiesToHeal[j]); if Logic.GetEntityType(Data[i]) == EntitiesToHeal[j] then local Maxhealth = Logic.GetEntityMaxHealth(Data[i]); if Logic.GetEntityHealth(Data[i]) < Maxhealth then Logic.HealEntity(Data[i], Logic.GetEntityMaxHealth(Data[i]) * 0.1); if Logic.GetEntityHealth(Data[i]) == Maxhealth then table.remove(Data, i) if #Data == 0 then Data = nil return true end end end end end end end
Funktioniert recht schick, weil stufenweise repariert wird.
Gruß
CineMachus
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
Lesezeichen