+ Antworten
Ergebnis 1 bis 16 von 16
  1. #1
    Jäger Avatar von Sokrates
    Registriert seit
    22.10.2007
    Ort
    Schweiz / Baselland
    Beiträge
    274

    Standard Gegnerische Burg wird nicht repariert

    .....
    Geändert von Sokrates (06.12.2008 um 23:48 Uhr)
    Für den Weisen bedeutet jeder Tag ein neues Leben.

  2. #2
    Schafszüchter Avatar von Netsurfer
    Registriert seit
    01.09.2005
    Ort
    Köln/ Cologne
    Beiträge
    1,121
    Blog Einträge
    10

    Standard AW: Gegnerische Burg wird nicht repariert

    Hi,

    ist eine KI für diese PlayerID aktiviert?
    Oder mal mit
    Code:
    AICore.SetNumericalFact( AIPlayerID, "BARB", 1 )
    probieren.

    Oder evt. funktioniert (lokal):
    Code:
    GUI.SetRepairAlarm(Logic.GetHeadquarters(_PlayerID), true)
    Gruß Gunther

    PS: Wissen tu ich es aber auch nicht - die KI das "unbekannte Wesen", da ist alles möglich.
    Geändert von Netsurfer (31.07.2008 um 15:15 Uhr)
    ___________________________


    ___________________________

  3. #3
    Wirt
    Registriert seit
    04.10.2007
    Beiträge
    875

    Standard AW: Gegnerische Burg wird nicht repariert

    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.

  4. #4
    Schafszüchter Avatar von Netsurfer
    Registriert seit
    01.09.2005
    Ort
    Köln/ Cologne
    Beiträge
    1,121
    Blog Einträge
    10

    Standard AW: Gegnerische Burg wird nicht repariert

    Zitat Zitat von Old McDonald Beitrag anzeigen
    Intern werden nur NPC-Dörfer korrekt abgefangen, sodass der Feueralarm aktiviert wird.
    @Old McDonald: Feueralarm und Reparaturalarm sind aber auch zwei veerschiedene Paar Schuhe!

    @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.
    Ah, also ist Reparatur ~= Wiederaufbau. Hatte angenommen, dass Wiederaufbau = Reparatur (von 0) ist.
    Wieder was gelernt - danke!

    Gruß
    Gunther
    ___________________________


    ___________________________

  5. #5
    Wirt
    Registriert seit
    04.10.2007
    Beiträge
    875

    Standard AW: Gegnerische Burg wird nicht repariert

    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)

  6. #6
    Jäger Avatar von Sokrates
    Registriert seit
    22.10.2007
    Ort
    Schweiz / Baselland
    Beiträge
    274

    Standard AW: Gegnerische Burg wird nicht repariert

    Zitat Zitat von Old McDonald Beitrag anzeigen
    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 Assertion failed!
    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.
    Hi

    Also wie muss ich jetzt genau vorgehen. Der Spieler ist Player 2.
    Die Burg wurde von angreiffenden Katapulten zu 50 % zerstört.
    Bitte Funktion mit Parameterangabe.

    Gruss Sokrates
    Für den Weisen bedeutet jeder Tag ein neues Leben.

  7. #7
    Schafszüchter Avatar von Netsurfer
    Registriert seit
    01.09.2005
    Ort
    Köln/ Cologne
    Beiträge
    1,121
    Blog Einträge
    10

    Standard AW: Gegnerische Burg wird nicht repariert

    Zitat Zitat von Old McDonald Beitrag anzeigen
    Hmm - jetzt muss ich noch einmal überlegen... Wird der Feueralarm direkt in einen aktiven Reparaturalarm umgewandelt? Ich glaube es zumindest mal.
    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?

    Ginge es nur darum, den Reparaturalarm zu aktivieren, ginge das auch mit Logic.SetRepairAlarm().
    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öhnt )

    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.
    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.

    Gruß
    Gunther
    ___________________________


    ___________________________

  8. #8
    Wirt
    Registriert seit
    04.10.2007
    Beiträge
    875

    Standard AW: Gegnerische Burg wird nicht repariert

    Wenn Sokrates von einem Angriff spricht, müsste Mission_CallBack_OnBuildingBurning() normalerweise aufgerufen werden...

    Das ginge dann in etwa so:
    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
    Und falls das Gebäude nicht brennen sollte - dann Mission_Callback_EntityHurt().

  9. #9
    Jäger Avatar von Sokrates
    Registriert seit
    22.10.2007
    Ort
    Schweiz / Baselland
    Beiträge
    274

    Standard AW: Gegnerische Burg wird nicht repariert

    Zitat Zitat von Old McDonald Beitrag anzeigen
    Wenn Sokrates von einem Angriff spricht, müsste Mission_CallBack_OnBuildingBurning() normalerweise aufgerufen werden...

    Das ginge dann in etwa so:
    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
    Und falls das Gebäude nicht brennen sollte - dann Mission_Callback_EntityHurt().
    Hi

    Gebäude Brand wird gelöscht aber Reparatur erfolgt nicht.
    Also wäre Mission_Callback_EntityHurt() das richtige!
    Ist da der Block Code der selbe oder ein anderer?

    Gruss Sokrates
    Für den Weisen bedeutet jeder Tag ein neues Leben.

  10. #10
    Wirt
    Registriert seit
    04.10.2007
    Beiträge
    875

    Standard AW: Gegnerische Burg wird nicht repariert

    Relativ gleich, nur mehr Checks:
    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
    Aber überhaupt nicht getestet...

  11. #11
    Jäger Avatar von Sokrates
    Registriert seit
    22.10.2007
    Ort
    Schweiz / Baselland
    Beiträge
    274

    Standard AW: Gegnerische Burg wird nicht repariert

    Zitat Zitat von Old McDonald Beitrag anzeigen
    Relativ gleich, nur mehr Checks:
    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
    Aber überhaupt nicht getestet...
    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.

  12. #12
    Jäger Avatar von Sokrates
    Registriert seit
    22.10.2007
    Ort
    Schweiz / Baselland
    Beiträge
    274

    Standard AW: Gegnerische Burg wird nicht repariert

    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
    end
    Mit dieser Funktion werden automatisch alle Hauptgebäude eines Spielers repariert.

    Gruss Sokrates
    Für den Weisen bedeutet jeder Tag ein neues Leben.

  13. #13
    Schafszüchter Avatar von Netsurfer
    Registriert seit
    01.09.2005
    Ort
    Köln/ Cologne
    Beiträge
    1,121
    Blog Einträge
    10

    Standard AW: Gegnerische Burg wird nicht repariert

    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
    ___________________________


    ___________________________

  14. #14
    Jäger Avatar von Sokrates
    Registriert seit
    22.10.2007
    Ort
    Schweiz / Baselland
    Beiträge
    274

    Standard AW: Gegnerische Burg wird nicht repariert

    Zitat Zitat von Netsurfer Beitrag anzeigen
    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?
    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
    Habe es getestet und funktioniert einwandfrei...

    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.

  15. #15
    Fischer Avatar von CineMachus
    Registriert seit
    30.09.2007
    Beiträge
    240

    Standard AW: Gegnerische Burg wird nicht repariert

    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)
    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
    Der _castletyp wurde eingebaut, weil auf der Map verschiedene Burgtypen vorhanden sind.
    Funktioniert recht schick, weil stufenweise repariert wird.

    Gruß
    CineMachus

  16. #16
    Jäger Avatar von Sokrates
    Registriert seit
    22.10.2007
    Ort
    Schweiz / Baselland
    Beiträge
    274

    Standard AW: Gegnerische Burg wird nicht repariert

    Zitat Zitat von CineMachus Beitrag anzeigen
    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)
    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
    Der _castletyp wurde eingebaut, weil auf der Map verschiedene Burgtypen vorhanden sind.
    Funktioniert recht schick, weil stufenweise repariert wird.

    Gruß
    CineMachus
    Hi

    Ausser der Stuffenweise Reparierung macht eigentlich mein Vorschlag genau das selbe!
    Den Castle Typ braucht man gar nicht. Burgen sind ja alles Hauptquartiere.

    Gruss Sokrates
    Für den Weisen bedeutet jeder Tag ein neues Leben.

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

     

Ähnliche Themen

  1. Usermap Die Burg der Ahnen
    Von Norden im Forum Siedler 6 AeK Singleplayer
    Antworten: 0
    Letzter Beitrag: 21.02.2008, 17:20
  2. Script wird wegen Größe nicht geladen?
    Von Hexe_aus_Mol im Forum Siedler 5 DEdK Scriptecke
    Antworten: 8
    Letzter Beitrag: 19.12.2007, 10:11
  3. Nun wird es nicht mehr lange dauern und EA schnappt sich Ubisoft
    Von SpiderFive im Forum Cafe Paperlapapp (Klön)
    Antworten: 4
    Letzter Beitrag: 06.12.2007, 19:04

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein