Seite 81 von 82 ErsteErste ... 317179808182 LetzteLetzte
Ergebnis 801 bis 810 von 813

Thema: Eure Modding-Pläne für Fallout 4

  1. #801
    Not my president Avatar von Boïndil
    Registriert seit
    20.07.2008
    Ort
    Vaullt 101
    Beiträge
    12.056
    Gamer IDs

    Gamertag: PixelMurder

    Standard

    Schon krass, was man alles tun kann, nur um sein Log sauber zu kriegen.
    Echt, ich kann jetzt zwei Stunden zocken und habe vielleicht dreihundert Zeilen im Log, von denen die meisten meine eigenen Ausgaben sind. Die kann ich jetzt entfernen, das war nur zum Testen, welche Objekte Fehler betreffen und ob meine Tweaks überhaupt greifen.
    Habe etwa heute ein Script von einer Nuka-World-Quest völlig entfernt. Das war scheinbar nur noch dazu da, mein Log zu versauen, denn funktionieren konnte es sowieso nicht. Dann gab es einen Mod mit funktionierenden Wasserbecken, der scheinbar auf eine ältere Version des Trinken-Scripts setzte, alles gefixt.
    Dann auch noch das Distel-Script gefixt, damit es keine sinnlosen Fehler mehr ausspuckt. Dieses und das Trinken-Script waren beide von der Art, dass sie Fehler praktisch auslösen mussten, kein Check dahinter, nix.
    Sicher hat nicht jede Crash-Meldung im Log irgendeine Bedeutung für das Spiel, aber ich wollte die hunderte bis tausende Zeilen ausmisten, die die echten Fehler verbergen.

    Nebenbei durchsuche ich gerade den Nexus nach neuen Goodies, vor allem Texturen. Gutes Gefühl, wenn man nicht an RAM sparen muss
    Das hier zum Beispiel: FlaconOil's HD ReTexture Project in 4k 2k
    Habe gerade heute gedacht, wie sieht doch das Red Rocket bescheiden und nach XBox 360 aus, wenn man näher hinschaut und das hier scheint die Kur dafür zu sein. Eiegentlich ind fast alle Texturen ersetzt, aber zwischendurch gibts immer wieder solche schwammigen Lücken, die negativ auffallen.

  2. #802
    Not my president Avatar von Boïndil
    Registriert seit
    20.07.2008
    Ort
    Vaullt 101
    Beiträge
    12.056
    Gamer IDs

    Gamertag: PixelMurder

    Standard

    Jup, Fehlermeldungen habe ich so wenige, wie man haben kann, es kann also passieren, dass ich eine Stunde zocke, ohne eine einzige unerwartete Meldung im Log. Was nicht zwangsläufig bedeutet, dass das Spiel jetzt so funktioniert, wie es sollte.

    Die Siedler haben immer noch die Tendenz, plötzlich wie die Ölgötzen alle im Rudel rumzustehen, wenn ich eine Siedlung betrete. Das hat mich dazu getrieben, endlich Log-Meldungen aller relevanter Eckpunkte eines WorkshopNPC auszugeben. Darin kann man z.B. sehen, ob ein Actor, der Wache(WorkshopNPC.isGuard) sein sollte, gerade ein Sandbox-Package aktiv hat oder ob er überhaupt eine gültige Verlinkung zu seinem Wachposten hat. Man kann auch im Log sehen, ob er eine gültige Workshop-ID und Home-Link hat. Die Basis jedes Debugens ist die Information, welche Variablen gerade aktiv sind.

    Da ich plötzlich auch noch ständig Raider-Überfälle ohne Meldungen auf das Red-Rocket mit Leichen habe, die sich nicht durch Scrap Dead Things aufräumen lassen, habe ich das System auch gleich noch auf alle Actors übernommen, die von meinem Hardcore-Magic-Effekt betroffen sind. Jeder kriegt beim Tod ein Debug-Item, das ein Log auslöst, wenn es der Spieler im Container verschiebt. Bei allen anderen Actors als Siedler sind andere Daten wichtig, etwa Encounter-Zone, Editor-Location-Zelle, Leveled Actor Base, usw. Hatte das Creation Kit nebenan offen und habe sämtliche relvanten Eigenschaften von Actor und ObjectReference in meine Log-Funktion kopiert.
    In dem Fall deutet alles drauf hin, dass das entweder DLC- oder Mod-Raider waren und ihr Respawn-Verhalten darauf hin, dass das Respawn-Flag falsch gesetzt ist.. Das Resultat von ObjectReference.GetBaseObject() in meinem Log kann ich aber jetzt direkt in FO4Edit als Suchbegriff eingeben und weiss sofort, woher es stammt.
    Eigentlich sind bei mir die einzigen Messages, die noch tatsächlich sichtbar und weggeklickt werden müssen, die Überfall-Meldungen. Es kann aber sein, dass ich noch nicht alle DLC drauf angepasst habe.
    Die normalen Info-Boxen links oben habe ich nämlich komplett abgeschaltet, da sie mit zu 99% irrelevanten Meldungen penetrant mein HUD zugemüllt haben. Da kann es also sein, dass ich einen Überfall nicht mitgekriegt habe.
    Es gehört nebenbei auch zu meinem System, dass Überfälle in einem anderen Worldspace völlig geblockt sind, da ich nicht die geringste Lust habe, nach Far Harbor zu reisen oder umgekehrt. Die Chance auf einen Überfall wird zudem deutlich verringert, wenn man sich weiter als so und so von einem potentiellen Ziel weg befindet, während sie praktisch auf 100% steigt, wenn man in der Nähe ist.
    Schlussendlich wird man prinzipbedingt etwa gleich oft wie vorher überfallen, nur die Laufwege sind minimiert, sodass man im Prinzip nie in Versuchung gerät, schnell zu reisen. Werde das bei Gelegenheit noch erweitern, damit gewisse Quest-Zustände das auch abstellen.
    In dem Fall der Raider kommt es mir eher wie ein Bug vor, aber das muss ich zuerst untersuchen.

    Hier übrigens noch die Segnungen von guten Texturen, die Gesichter sehen jetzt schon fast so aus, wie sie in einem Spiel dieses Jahrgangs aussehen sollten. Okay, Mama Murphy hat ein wenig zu glänzende rote Lippen(was ich noch fixen werde, auch bei meinem eigenen Charakter), aber die Alternative ist diese Frechheit von einer Playstation 2-Fratze mit toten Fischaugen, die im Netz schon oft parodiert wurde, selbst Angry Joe fürchtete sich vor dieser Fresse (Video bei 12.50).
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken Klicke auf die Grafik für eine größere Ansicht 

Name:	Fallout4-2017-06-17-19-39-21-346.jpg 
Hits:	23 
Größe:	48,8 KB 
ID:	22823   Klicke auf die Grafik für eine größere Ansicht 

Name:	Fallout4-2017-06-17-19-43-12-243.jpg 
Hits:	23 
Größe:	55,1 KB 
ID:	22824   Klicke auf die Grafik für eine größere Ansicht 

Name:	Fallout4-2017-06-17-19-40-09-313.jpg 
Hits:	24 
Größe:	36,8 KB 
ID:	22825   Klicke auf die Grafik für eine größere Ansicht 

Name:	Fallout4-2017-06-17-20-59-11-886.jpg 
Hits:	24 
Größe:	105,6 KB 
ID:	22826  

  3. #803
    Not my president Avatar von Boïndil
    Registriert seit
    20.07.2008
    Ort
    Vaullt 101
    Beiträge
    12.056
    Gamer IDs

    Gamertag: PixelMurder

    Standard

    So, neues Projekt, es hat schon lange danach geschrien und ich hatte es im Hinterkopf, aber bisher habe ich mich eher ums technische und grafische Funktionieren des Spiels kümmern müssen.

    Da kann ich also jetzt die Bombensiedlungen bauen, die mehr oder weniger so funktionieren, wie es sich Beth vorgestellt, aber nicht hingekriegt hat. Ich kann fast jedes Objekt bauen und alls scrappen, wa ich möchte. Mods wie Northland Diggers und solche, die hübschere und mehr Werkbänke und Verkaufsstände, sowie zuweisbare Öfen und craftbare Idle-Marker bieten, bringen ja schon ansatzweise ein wenig Leben rein, abseits der drei Monopoly-Steine, die Verkaufsstände darstellen sollten.

    Habe jetzt zum Beginn des Spiels schon mal Sanctuary und Red Rocket zur Siedlung gemacht, nebenbei grinde ich ja auch XP, um endlich in die Wildnis zu können, ohne massakriert zu werden
    Im Hintergrund habe ich schon mal beide Siedlungsgrenzen so nahe gelegt, dass ich im Prinzip Strassenlampen von beiden Seiten her so platzieren kann, dass es durchgängig beleuchtet ist. Gab noch ein wenig Arbeit mit den Grenzen. Gerade deswegen wurmt es mich dann so, dass das keine sichtbaren Vorteile bringt. Da habe ich Verkaufstände und tolle ausgestattete Bars(d.h. werde ich in dreissig Stunden haben), aber keiner geht dahin. Da habe ich Misc-Trader, aber keiner weiss, an wen sie den Schrott verkaufen, wenn man nicht da ist. Da hab ich eine supertolle Bar und sogar eine Siedlerin, die man als Sängerin einem craftbaren Micro zuweisen und mit meinen craftbaren Klamottenpacks in Stars verwandeln kann, aber keiner hört zu.
    Das ist auch der Grund, wieso mir Sanctuary nicht gefallen hat, die Siedler knien irgendwo hinter den Häusern am Boden oder stehen um die Scavenger-Station rum, aber die Strassen sind tot.Sowas fällt einem bei kleineren Siedlungen gar nicht so auf.
    Habe jetzt vor, ein System zu coden, das Leben in die Bude bringt. Zum einen mit kleinen craftbaren Gegenständen, die Siedler anziehen, weil sie denken, da sei eine Bar. Es gibt ein Attraction-Keyword, das Siedler anzieht, wenn sie Feierabend haben, das wird in Vanilla nur für die drei Food-Verkaufsstände und Bar-Zellen verwendet. Die Siedler können dann rund um das Objekt Idles machen, sitzen und essen, wähend es aktuell in der Siedlung mehr oder weniger Zufall ist, wo ich die Siedler aufhalten.
    Im Moment mache ich gerade einen Test mit einem Tisch-Ventilator, den man irgendwo in der Mitte einer Bar aufstellen kann und Siedler anziehen sollen.

    Dann möchte ich aber auch Reisende, Händler und sonst Unique-Charakter spawnen, die deine Siedlung besuchen kommen, wie ich es damals schon für WastelandWarrior für Fallout 3 umgesetzt hatte. Vorzugsweise möchte ich das alles scripten und keine Spawn-Punkte oder Siedler in der Welt platzieren. Es muss kein Ramba-Zamba sein, aber ich möchte ständig irgendjemanden mit einem Ziel rumlaufen oder sich entspannen sehen. Ich möchte, dass Reisende von den Händlern kaufen und dass meine Bars abends besucht sind.
    Habe auf jeden Fall schon mal ein Actor-Template, drei Packages, die auf Scripte reagieren, und eine Encounter-Quest erstellt, mit der das gesteuert wird. Wolllte zuerst mit meiner Quest in die Workshop-Quest einklinken und Reisende so spawnen, wie sonst Überfälle gespawnt werden. Leider sind die Spawnpunkte der Workshops zum Teil unsäglich gesetzt, mitten in der Siedlung, was auch erklärt, wieso man teilweise nach einer Schnellreise zu einem Überfall abgeknallt wird, bevor man sich richtig gesammelt hat.

    Das Ziel soll etwa so aussehen, dass sporadisch Reisende sichtbar eintrudeln, während der Spieler in einer Siedlung ist, dann einige Zeit da bleiben und interagieren und dann wieder gehen. Muss noch abchecken, ob ich irgendein bestehendes Objekt als Spawn-Punkt missbrauchen kann, oder ob ich doch noch solche selbst platzieren muss. Oder ich mache es so wie in WLW, indem ständig drei Spawnmarker in einem Intervall dem Spieler nachgezogen wurden, von denen der am weitesten entfernte ermittelt wurde. Dabei geht es darum, dass Actors weit genug weg vom Spieler und nicht an einem unmöglichen Ort gespawnt werden. Anyway, kriege es schon noch hin.

  4. #804
    Not my president Avatar von Boïndil
    Registriert seit
    20.07.2008
    Ort
    Vaullt 101
    Beiträge
    12.056
    Gamer IDs

    Gamertag: PixelMurder

    Standard

    Das System wird grösser, als ich zuvor gedacht hatte. Da Fallout 4 allergisch auf Script-Updates reagiert, muss ich schon jetzt mehr Dinge vorausplanen, als ich es vorerst brauche.

    Es wird eine Main-Encounter-Quest geben, die das alles kontrolliert. Die Basis wird das Main-Quest-Script sein, das ständig berechnet, wie der aktuelle Zustand des Spiels ist, die Spawn-Marker nachschiebt und Actors spawnt oder entlädt.
    Dann wird es einzelne Sub-Quests geben, die eine bestimmte Art von Encountern beschreiben, die können nichts anderes, als Encounter definieren und sie in einem bestimmten Abstand der Main-Quest übergeben, das sie entgegen nehmen und spawnen oder auch ablehnen kann, wenn zuviele Actors geladen sind oder gerade Quest so und so läuft. Im Gegensatz zu Beth überlasse ich die Dinge nicht gerne dem reinen Zufall.

    Der Hintergrund: Eine umfangreiche Encounter-Gruppe benötigt enorm viele Flags, um sie zu beschreiben, während eine Kakerlakenpest nur wenige braucht. Also unterscheide ich verschiedene Encounter-Typen mit jeweils einem Script, jedes für sich enthält nur die minimal notwendigen Daten-Definitionen und Funktionen, um diese mit dem Datentyp der Main-Quest zu mappen. Diese Sub-Scripte können nur auswählen, nicht selbst spawnen. So muss ich keine Funktionen sinnlos duplizieren.

    Die Haupt-Quest konfiguriert und spawnt dann die Actors nach diesem Modell. Es ist überhaupt nicht notwendig, zig verschiedene Actors im Creation Kit zu definieren, im Prinzip braucht es nur wenige Archetypen, wie Mensch(zufälliges Geschlecht|weiblich|männlich), Ghul(Leuchtender|Normalo|Superzombie).
    Grösse, Fraktionen, Aggression und Ausrüstung lassen sich eigentlich alle per Script definieren. Im Prinzip sind die gelevelten Actors fast nur Gesichter-Lieferanten. Natürlich sollte man nicht zu viel scripten, vielleicht definiere ich noch ein paar Typen wie Soldat oder Raider, um die Performance nicht zu gefährden. Wenn ich zehn Typen gleichzeitig Raider-Rüstung zuweisen muss, lohnt sich wahrscheinlich eine Raider-Klasse.

    Struct EncounterDefinition
    Spoiler:
    Code:
            
        Int GroupToughness = 0
        {Used especially for enemy encounters.}
        Bool GroupIsHostile
        { Group is considered hostile, used to block hostile groups in some areas.} 
        Faction GroupFaction
        { This faction will be added to the encounters, if defined. Group will attack player on sight if you use a hostile faction.}
        Int GroupScalePercentage = 0
        { Group size  will be scaled randomly with this factor. }
        Location GroupEndLocation
        { Package target location. If undefined, it's Diamond City(or an appropriate place in an addon.}
        Bool GroupRelaxAllowed = true
        { Group can relax around the player position or at the current location if it's a settlement. If false, the group will not stop around the player and head directly to the end location.}
        Float GroupRelaxTime = 0.0
        { If group is allowed to relax near the player. If defined it will overrride the global relax time. }
        ActorBase GroupActor0
        { The Leader. If defined the whole group will follow this actor.}
        ActorBase GroupActor1
        { Group actor. }
        Int GroupActor1Count = 0
        { Group count min. Can randomly be increased by GroupScalePercentage.}
        ActorBase GroupActor2 
        { Group actor. }
        Int GroupActor2Count = 0
        { Group count min. Can randomly be increased by GroupScalePercentage.}
        ActorBase GroupActor3
        { Group actor. }
        Int GroupActor3Count = 0
        { Group count min. Can randomly be ncreased by GroupScalePercentage.}
        ActorBase GroupActor4
        { Group actor. }
        Int GroupActor4Count = 0
        { Group count min. Can randomly be increased by GroupScalePercentage.}
        ActorBase GroupActor5
        { Group actor. }
        Int GroupActor5Count = 0
        { Group count min. Can randomly be increased by GroupScalePercentage.}
        ActorBase GroupActorSpecial
        { If defined only one will spawn. Can be used for special characters like a behemoth.}
        Location GroupTargetLocation Hidden
        { Holds the current player location.}
        Float GroupEncounterEndHour Hidden
        { Holds the calculated hour when the encounter will end.}
        Bool GroupIsInactive = false Hidden
        { Unloaded groups will be set to inactive and can be overwritten by new encounters.}
    

    EndStruct

    Ich weiss ja, dass ich noch der einzige Modder bin, der überhaupt im grossen Stil codet, trotzdem ein Tipp:
    Visual Studio Code kann jetzt dank einem Plugin Papyrus, eine gehörige Erleichterung.
    Eigentlich habe ich bis vor kurzem traditionell Notepad++ für exotische Sprachen eingesetzt, das ebenfalls ein Papyrus-Schema hat. Inzwischen hat aber Visual Studio Code mit seinen enorm vielen Erweiterungen das weit überholt, ich liebe ausserdem das dunkle Schema.

  5. #805
    Not my president Avatar von Boïndil
    Registriert seit
    20.07.2008
    Ort
    Vaullt 101
    Beiträge
    12.056
    Gamer IDs

    Gamertag: PixelMurder

    Standard

    Ich muss wahrscheinlich ein Rad ab haben, dass ich seit zwei Tagen nur noch Visual Studio Code zocke Das sind bisher drei Scripts mit insgesamt 800 Zeilen, daneben noch im CK über 10 Packages, ein paar neue Keywords, einen Template-Actor und zwei Quests erzeugt.
    Hat doch eine hübsche Grafik mein VSCode und ich verschiebe je nachdem, an welchem Script ich gerade arbeite, die Frames und habe den Überblick, wie die zusammen gehören. Die müssen alle fehlerlos zusammen arbeiten, damit es nicht rum bugt. Mal sehen, ob ich das morgen oder übermorgen zum ersten Mal im Spiel sehen kann.
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken Klicke auf die Grafik für eine größere Ansicht 

Name:	Unbenannt-1.jpg 
Hits:	22 
Größe:	158,2 KB 
ID:	22828  

  6. #806
    Not my president Avatar von Boïndil
    Registriert seit
    20.07.2008
    Ort
    Vaullt 101
    Beiträge
    12.056
    Gamer IDs

    Gamertag: PixelMurder

    Standard

    So, meine Ferien haben begonnen, abgesehen davon, dass ich morgen früh nochmals ein paar Stündchen etwa das selbe tun, was ich auch am Feierabend mache, nämlich scripten
    Wobei das hier Peanuts sind, wenn ich es mit meinen AJAX-UIs vergleiche, an denen ich sonst rumschrauben muss.

    Der Code hier ist für meine Encounter-Gruppen, die aus Actors bestehen, die entweder Anführer, Gruppenmitglied oder selbstständig agierendes Verhalten haben. Wenn es einen lebenden Anführer gibt, übernimmt jedes verlinkte Gruppenmitglied automatisch das Verhalten seines Anführers.
    Die States werden von den Conditions in den KI-Packages ausgewertet und bewirken etwa, dass ein Actor im State 3 um seinen Anführer herum innerhalb einer Siedlung sandboxt, bis die eingestellte Zeit erreicht ist.
    Fünf Package-Zustände klingen nicht nach viel, aber damit kriegt man auf jeden Fall mehr hin, als das, was man in Vanilla haben kann. Je nach Actor-Typ kann ein Package im Stauts drei auch etwas anderes bedeuten, zum Beispiel, dass das Überfallziel erreicht ist, dass einer in der Bar angekommen ist oder dass eine Maulwurfsrattenmutter relaxen kann.
    Natürlich kann ich auch die Aggression oder die Fraktion eines Actors scripten, damit ich nicht zwei für diese Details erstellen muss.
    Ist sicher noch nicht das Gelbe vom Ei, aber ich werde es nächstens für den ersten Test einsetzen können. Diese State-Sache ist programmierisch nicht besonders elegant und möglicherweise ein bisschen weniger performant als die eingebauten States. Wahrscheinlich macht es allerdings nicht so viel aus, da es vielleicht zwanzig Actors gleichzeitig geben kann, wenn es hoch kommt. Dafür möchte ich zum Ansporn endlich mal ein Resultat sehen, bevor ich Details schleife und die Sache perfektioniere, bis Beth vor Neid erblasst. Die Erfahrungen, die ich mit WastelandWarrior gemacht habe, helfne mir natürlich, hatte damals schon dreissig-köpfige Karawanen mit gescripteten Positionen, die recht realistisch waren.



    Spoiler:
    Code:
    Scriptname THEW:THEW_Scr_ActorEncounter extends Actor Conditional
    Group ActorConfiguration
    THEW:THEW_Scr_EncounterQuest:EncounterActorDescription Property ActorDescription Auto
    { This configuration will be overriden unless you set ActorIsPredefined to true. }
    Int Property ActorBehaviour = 0 Auto Conditional
    { This var will be set by the actor script to control package states.
    If an actors is linked to another with the keyword THEW_KW_Encounter_Leader, he will copy his state from this actor.
    If an actor has linked refs with the keywords THEW_KW_Encounter_TargetEnd and THEW_KW_Encounter_TargetStart he will use his own state.
    If an actors is linked to another with the keyword THEW_KW_Encounter_Leader and he is dead, he will flee to the linked end location.
    -1: Flee to linked ref with keyword THEW_KW_Encounter_TargetEnd
    0:  Waiting for configuration
    1:  Travel to start location
    2:  Sandbox around start location
    3:  Travel to end location
    4:  Sandbox around end location
    }
    EndGroup
    
    Group MandatoryData
    Actor Property Player Auto Const Mandatory
    Keyword Property THEW_KW_Encounter_Target_Start Auto Const Mandatory
    Keyword Property THEW_KW_Encounter_Target_End Auto Const Mandatory
    Keyword Property THEW_KW_Encounter_Target_Flee Auto Const Mandatory
    ActorValue Property AvAggression Auto Const Mandatory
    ActorValue Property AvConfidence Auto Const Mandatory
    ActorValue Property AvAssistance Auto Const Mandatory
    GlobalVariable Property GameHour Auto Const Mandatory
    GlobalVariable Property GameDaysPassed Auto Const Mandatory
    THEW:THEW_Scr_EncounterQuest Property EncounterQuest Auto Const Mandatory
    EndGroup
    
    ; --- Private vars ----
    int actorState = 0                      ; Actor state. 0: Not initialized, 1: waiting for configuration, 2: configured, 3: relaxing around player, 4: travelling to the end destination, 5: disabled    
    float timerInterval = 20.0              ; Timer interval in seconds.
    float sandboxEndTime = 0.0              ; This timer will be used to track the sandbox duration.    
    THEW:THEW_Scr_ActorEncounter myLeader   ; The linked actor as encounter actor script.
    
    ; Initializes the actor on first load, unloads him on second.
    Event OnLoad()
        if actorState == 0
            actorState = 1
            StartTimer(timerInterval / 2)
            EncounterQuest.LogMessage(self.GetBaseObject(), "OnLoad()", "Actor initialized.")
        else
            if playerIsInSight() == false
                deleteActor()
            endif
        endif
    EndEvent
    
    Event OnDeath()
        actorState = 666
        SetLinkedRef(none)
        CancelTimer()
    EndEvent
    
    Event OnCellDetach()
        deleteActor()
    EndEvent
    
    Event OnTimer(int aiTimerID)
        updateActor()
    EndEvent
    
    Function updateActor()
        if actorState == 1  ; Try to initialize actor and send him to the first destination.
            initActor()
            StartTimer(timerInterval / 2)
        elseif actorState == 2 ; Actor is on the way to the first destination.
            if ActorDescription.ActorIsLeader || ActorDescription.GroupHasLeader == false 
                if GetDistance(GetLinkedRef(THEW_KW_Encounter_Target_Start)) < EncounterQuest.PackageChangeDistance
                    if ActorRelaxAllowed == true 
                        sandboxEndTime = GameDaysPassed + GroupRelaxTime
                        ActorBehaviour = 2
                        EvaluatePackage()
                        actorState = 3
                    else
                        ActorBehaviour = 3
                        EvaluatePackage()
                        actorState = 4
                    endif
                endif
            else
                updateFromMyLeader()
            endif
            StartTimer(timerInterval)
        elseif actorState == 3 ; Actor has reached destination and will sandbox for a defined time.
            if ActorDescription.ActorIsLeader || ActorDescription.GroupHasLeader == false 
                if sandboxEndTime > GameDaysPassed
                    ActorBehaviour = 3
                    EvaluatePackage()
                    actorState = 4
                endif
            else
                updateFromMyLeader()
            endif
            StartTimer(timerInterval)
        elseif actorState == 4 ; Actor is on the way to the end location and will relax there until the cell is deatached or the player goes away.
            if ActorDescription.ActorIsLeader || ActorDescription.GroupHasLeader == false 
                if GetDistance(GetLinkedRef(THEW_KW_Encounter_Target_End)) < EncounterQuest.PackageChangeDistance
                    ActorBehaviour = 4
                    EvaluatePackage()
                    actorState = 5
                endif
            else
                updateFromMyLeader()
                StartTimer(timerInterval) ; Leaders do not need timer anymore.
            endif
        endif
        logActorState()
    EndFunction
    
    Function initActor()
        if ActorDescription.ActorConfigReady == true
            SetValue(AvAggression, ActorDescription.ActorAggression)
            SetValue(AvConfidence, ActorDescription.ActorConfidence)
            SetValue(AvAssistance, ActorDescription.ActorAssistance)
            if ActorDescription.ActorFaction
                AddToFaction(ActorDescription.ActorFaction)
            endif
            ActorBehaviour = 1
            EvaluatePackage()
            actorState = 2
        endif
    EndFunction
    
    Function deleteActor()
        actorState = 666
        SetLinkedRef(none)
        CancelTimer()
        DisableNoWait()
        Delete()
    EndFunction
    
    Bool Function playerIsInSight()
        if GetDistance(Player) > ActorDescription.PlayerOutOfSightDistance
            return false
        endif
        return true
    EndFunction
    
    Bool Function playerIsNear()
        if GetDistance(Player) < ActorDescription.PlayerNearDistance
            return true
        endif
        return false
    EndFunction
    
    int[] Function getMyLeaderBehaviour()
        int [] behaviour = new int[2]
        behaviour[0] = actorState
        behaviour[1] = 0
        if myLeader
            if (myLeader as Actor).IsDead()
                behaviour[1] = -1
            else
                behaviour[1] = myLeader.ActorBehaviour
            endif
        elseif GetLinkedRef(THEW_KW_Encounter_Target_Start)
            if GetLinkedRef(THEW_KW_Encounter_Target_Start) As THEW:THEW_Scr_ActorEncounter
                myLeader = GetLinkedRef(THEW_KW_Encounter_Target_Start) As THEW:THEW_Scr_ActorEncounter
                behaviour[1] = myLeader.ActorBehaviour
            endif
        endif
        return behaviour
    EndFunction
    
    Function updateFromMyLeader()
        int[] myBehaviour = getMyLeaderBehaviour()
        if myBehaviour[0] != actorState
            ActorBehaviour = myBehaviour[1]
            EvaluatePackage()
            actorState = myBehaviour[0]
        endif
    EndFunction
    
    Function logActorState ()
        string log = EncounterQuest.AddToLog("isLeader", ActorDescription.ActorIsLeader)
        log += EncounterQuest.AddToLog("ActorState", actorState)
        log += EncounterQuest.AddToLog("ActorBehaviour", ActorBehaviour)
        EncounterQuest.LogMessage(self.GetBaseObject(), "Actor Info", log)
    EndFunction
    

  7. #807
    Not my president Avatar von Boïndil
    Registriert seit
    20.07.2008
    Ort
    Vaullt 101
    Beiträge
    12.056
    Gamer IDs

    Gamertag: PixelMurder

    Standard

    So, meine ersten Encounter sind endlich aufgetaucht, die nicht mehr sinnlos rumbuggen. Musste ein paar Mal meinen Code überarbeiten, bis es soweit war.

    Technologie:
    THEW_Encounter_Quest: Steuert das Encounter-System und stellt verschiedene Umgebungsvariablen und Helper-Funktionen zur Verfügung, die von Actors aufgerufen werden können. Enthält 10 Slots, in denen aktive Encounter gespeichert werden können, später wird man dann Frequenz, Anzahl aktiver Gruppen und andere Parameter in einem Menu verstellen können.
    THEW_Encounter_Quest_X (z.B. THEW_Enocunter_Quest_Travellers): Man kann beliebig viele Quests erstellen, die in einem Intervall versuchen können, eine Gruppe in der Haupt-Quest zu registrieren, die dann den Spawn übernimmt. In diesen Addon-Quests kann man gleiche Arten von Encounter-Gruppen ziemlich weitgehend konfigurieren z.B. Reisende, die nur im Commonwealth oder nur in Far Harbor spawnen können, wenn der Zielort nicht verstrahlt ist. In der Glowing Sea sind etwa normale Encounter gesperrt, da ein normaler Ödländer nicht dahin würde. Hingegen könnte ich eine Forschergruppe mit Strahlenschutzanzügen oder ein Trupp BoS dahin schicken.
    THEW:Encounter_Actor: Die Actors übernehmen die Steuerung ihres Verhaltens selbst oder kopieren sie vom verlinkten Anführer, sofern vorhanden. Wenn sie gespawnt sind, laufen sie zuerst zu einem Marker in der Nähe des Spielers. Wenn sie so konfiguriert sind, dass sie relaxen können, bleiben sie eine Zeit lang am Ort, sofern es der Spiele auch tut. Dabei wird erkannt, ob sich der Spieler in einer Siedlung aufhält. Wenn ja, wird der Marker zur Werkbank verschoben, sonst in die Nähe des Spielers. Nach der eingestellten Zeit oder wenn sich der Spieler entfernt, laufen sie in Richtung End-Marker, entweder zu einem BoS-Stützpunkt, oder Diamond City oder Far Harbor Hafen. Die Actors heben sich selbst auf, wenn der Spieler zu weit weg ist, aber sie bleiben solange erhalten, wie der Spieler in Sichtweite ist. D.h. man kann durchaus einem Trupp von Sanctuary aus nach Diamond City oder einer BoS-Gruppe zum Boston Airport folgen.

    Schwierig waren die Ausschluss-Bedingungen für den Spawn. Da Spawns nicht von Aktivatoren ausgelöst werden, sondern per Script, muss ich mit Programmlogik herausfinden, was der Spieler gerade macht oder wo er sich aufhält. Man sollte möglichst wenig den Eindruck kriegen, dass diese Encounters an diesem Ort oder zu dem Zeitpunkt nicht sein dürften.
    Bedeutet auch, dass ich etwa keinen Spawn-Marker in einen See oder an einen gefährlichen Ort verschieben darf und da findet man in der Engine keine gute Unterstützung.

    Als Programmierer kann ich es mir einfach nicht vorstellen, dass es in einem Spiel mit diesem Szenario keine direkten Script-Funktionen in der Art "IsSwimming()","IsGettingRads()" oder "IsCellRadiated()" gibt.
    Man kann nur per Script nach meinem Wissen nicht direkt herausfinden, ob der Spieler sich an einem verstrahlten Ort aufhält oder schwimmt. Man könnte z.B. fragen, ob ein RadiationHazard-Effekt auf dem Spieler ist oder ob ein Effekt ein Keyword "RadiationDammage" hat. Das funktioniert aber nur solange, wie man keine Perks hat oder Mittel schluckt, die die Wirkung aufheben.

    Es lässt sich auch nicht per Script direkt rausfinden, ob man sich in der Glowing Sea befindet. Es gibt schlicht und ergreifend kein Objekt, das ich per Script auf das abfragen kann.

    Ich musste also tatsächlich Dummy-Magic-Effects erzeugen, die an sich nichts tun, aber etwa "IsPlayerSwimming", "IsPlayerGettingRads" oder "IsPlayerinDangerousZone" heissen. Die sind alle in den gleichen Spell eingebunden, der dem Spieler beim Start verpasst wird, aber mit Conditions drauf, die es hier tatsächlich gibt: IsSwimming, IsUnderwater oder IsPlayerInRegion, was ich z.B. auf AudioExtGlowingSea abfrage.
    Es ist noch auszutesten, ob IsSpellTarget(RadiationHazardDeadly) im Gegensatz zu HasMagicEffect(RadiationHazard) auch funktioniert, wenn man immun gegen Rads ist.

    Anyway, macht ja auch Spass herumzutüfteln

    Edit
    Immerhin bin ich bereits am Feinschliff der Packages und Actors, weil die grundlegenden Script-Funktionen zu funzen scheinen. Die Gruppen sollen möglichst realistisch als Gruppe laufen, aber zwischendurch auch mal mit einigen Überraschungen aufwarten, die über das simple Folgen oder Reisen hinausgehen.
    Vorhin bin ich etwa einer Gruppe gefolgt, die am Drumlin Diner vorbei gelaufen ist, obwohl ich gerne dahin wäre. Meine menschlichen Actors sind mehr oder weniger darauf eingestellt, Strassen zu verwenden(Prefered Path). Werde deshalb noch an einigen neuralgischen Stellen Marker an den Strassen entlang aufstellen, die der Anführer als Ziel erkennt, damit er seine Reise unterbricht. Auch gedacht ist, dass manche Gruppen spezielle Verhalten haben können, wie etwa Sammler, die auch tatsächlich sammeln und sichtbar Leichen plündern. Da haben wir Endzeit, alles ist knapp und die Typen laufen einfach an Leichen mit hübschen Waffen und Lot vorbei.
    Führt in dem Moment noch zu weit, bis alle Grundfunktionen sauber ausgetestet sind, aber könnte auch kommen: eine Gruppe, die baden geht, z.B. bei meiner mustergültigen Siedlung Lake Quannapowit. Natürlich kommen dann auch wieder Karawanen mit echten Händlern und eigenem Stil. Im Prinzip kopiere ich eigentlich alles, was ich schon für Fallout 3 getan habe. Natürlich wird es auch wieder eingebaut, dass Parkuhren und überhaupt fast alles, das Scripte tragen kann und hübsch in der Welt verteilt ist, ein Spawn-Script kriegt.

  8. #808
    Not my president Avatar von Boïndil
    Registriert seit
    20.07.2008
    Ort
    Vaullt 101
    Beiträge
    12.056
    Gamer IDs

    Gamertag: PixelMurder

    Standard

    Meine Encounter werden ja immer besser, während die Workshop-NPC völlig im Schilf sind.

    Ich habe inzwischen ein Tool gecodet, das mir genaue Aussagen darüber macht, welche Variablen auf einem Siedler aktiv sind, mit was er verlinkt ist und welches KI-Verhalten gerade angesagt ist. Und das sagt mir, dass in beiden Siedlungen Sanctuary und Red Rocket das Verhalten völlig willkürlich ist, genauso gut könnte man es auswürfeln. Wachen haben nachts das Schlaf-Package drauf, was nicht sein kann. Aber scheinbar findet keiner sein Bett von all denen, die jetzt schlafen müssten, auch die nicht, die irrtümlich müssten. Die Sammler haben zwar am Tag das richtige Package, stehen aber genauso blöd herum, wie die Bauern.

    Log-Ausgabe von mir, eine Wache mit Schlafen-Package, was eigentlich gar nicht sein kann:
    Spoiler:
    Code:
    8/2017 - 10:51:45AM] THEW DEBUG - WorkshopNPC [workshopnpcscript < (FF0029F1)>] - workshop id: 23
    [07/08/2017 - 10:51:45AM] THEW DEBUG - WorkshopNPC [workshopnpcscript < (FF0029F1)>] - is guard: True
    [07/08/2017 - 10:51:45AM] THEW DEBUG - WorkshopNPC [workshopnpcscript < (FF0029F1)>] - is worker: True
    [07/08/2017 - 10:51:45AM] THEW DEBUG - WorkshopNPC [workshopnpcscript < (FF0029F1)>] - is scavenger: False
    [07/08/2017 - 10:51:45AM] THEW DEBUG - WorkshopNPC [workshopnpcscript < (FF0029F1)>] - is synth: False
    [07/08/2017 - 10:51:45AM] THEW DEBUG - WorkshopNPC [workshopnpcscript < (FF0029F1)>] - home link: [ObjectReference < (0022B5A8)>]
    [07/08/2017 - 10:51:45AM] THEW DEBUG - WorkshopNPC [workshopnpcscript < (FF0029F1)>] - guard link: [workshopobjectscript < (FF002A32)>]
    [07/08/2017 - 10:51:45AM] THEW DEBUG - WorkshopNPC [workshopnpcscript < (FF0029F1)>] - work link: None
    [07/08/2017 - 10:51:45AM] THEW DEBUG - WorkshopNPC [workshopnpcscript < (FF0029F1)>] - current package: [Package < (00038C10)>]
    [07/08/2017 - 10:51:45AM] THEW DEBUG - WorkshopNPC [workshopnpcscript < (FF0029F1)>] - workshoparent edit lock: False



    Eigentlich habe ich ja seit Fallout 3 eine ziemlich gute Ahnung von der KI-Steuerung von Actors, aber hier stimmt alles flächendeckend nicht, obwohl alle richtig verlinkt sind und die richtigen Variablen aufweisen, damit das richtige Package aktiv sein müsste, tut es aber nicht. Dabei hilft auch kein EvaluatePackage() und andere Tricks.

    Dabei weiss ich dank FO4Edit genau, wer an den Packages, Quests, Siedlern und Scripts herum schraubt, nämlich der Unofficial Patch oder ich selbst und beide sind da recht zurückhaltend, da sind keine wilden Änderungen drin.
    Die einzige Erklärung für das aktuelle Chaos ist, dass die Packages nicht in der richtigen Reihenfolge einem NPC zugeordnet sind, etwa das Schlaf-Package vor dem Guard-Package, das könnte dazu führen, dass Wachen schlafen gehen. Nur wüsste ich nicht, wie das passieren sollte. Die Package-Liste wird mit einem Alias jedem neuen Siedler zugeordnet, und das ist gegenüber Vanilla nicht geändert. Und am Ende des letzten Durchgangs hatte ich keine solchen Zicken mehr.

    Allerdings habe ich im WorkshopNPCScript gesehen, wie es dazu kommen kann, dass eine Wache auch ein Worker sein kann, wie man obigem Log entnehmen kann. Das Script ermittelt am Objekt durch Actor Values und Keywords, ob es eine Wach-Ressource ist oder eine Sammelstation. Und da wird nicht "entweder oder "abgefragt, sondern alles und die Wachtürme haben auch das WorkObject-Keyword drauf.
    Wenn die Packages in der richtigen Reihenfolge ausgewertet würden, wäre das gar kein Problem. Aber das Problem kann nur auftreten, wenn die Reihenfolge nicht richtig ist. Zuerst kommt das Wach-Package, das auf IsGuard abfragt, anschliessend die anderen, die auf Scavenger und Worker prüfen. Wenn das in der richtigen Reihenfolge getan wird, müsste das Guard-Package aktiv werden, egal ob das Worker-Flag auch drauf ist.
    Anyway, ich ändere gerade das WorkshopParent-Script und das WorkshopNPCScript, damit einer garantiert nur eines der drei Flags drauf hat, dann müsste das eigentlich wieder ins Lot kommen. Das würde erst reagieren, wenn ich eine Wache einer Plfanze zuweise. Also erweitere ich auch noch mein DebugScript, dass es die Methoden SetWorker() und SetScavenger() novchmals aufruft, um alle Flags so zu setzen, dass es beim Auswerten der Conditions keine Doppeldeutigkeiten gibt, dann ist es nämlich egal, welche Reihenfolge das hat.

  9. #809
    Not my president Avatar von Boïndil
    Registriert seit
    20.07.2008
    Ort
    Vaullt 101
    Beiträge
    12.056
    Gamer IDs

    Gamertag: PixelMurder

    Standard

    Mann, ist das zum Kotzen. Ich habe jetzt auf allen Packages, die nicht eindeutig waren, die Conditions verfeinert(z.B. Guard-Package: IsGuard ==1 && IsWorker ==0 && IsScavenger == 0), damit die Reihenfolge der Auswertung egal ist, ausserdem habe ich auf dem Schlafen-Package noch eingesetzt, dass Wachen ausgeschlossen werden. Dann habe ich die Scripte geändert, damit die Flags von der Quest zwingend richtig gesetzt werden oder von meinem Debug-Tool retroaktiv richtig gestellt werden.
    Und was sehe ich, wenn ich meine Logs auswerte? Die Wache hat am Feierabend das Bar-Verkäufer-Package drauf. Eigentlich unmöglich, da dieses nur aktiv werden kann, wenn der Actor in der Verkäufer-Fraktion ist. Ich weiss selbst nach ausgiebiger Analyse wirklich nicht, was da schief läuft, es fühlt sich fast an, wie wenn einer mein Spiel gehackt hätte und die Packages unabhängig von den Flags zufällig ausgewertet würden. Es besteht auch die Möglichkeit, dass GetCurrentPackage() nicht zuverlässig funktioniert und das Bar-Package nicht wirklich aktiv ist, bei Beth ist alles möglich*. Aber auf jeden Fall steht die Wache abends nicht am einzigen Ort, an dem sie stehen sollte und sandboxt friedlich vor sich hin.

    Von wegen alles möglich: PlaceActorAtMe() kann Actors schräg spawnen, die laufen dann in ihrer ganzen Zeit unabhängig vom Terrain im falschen Winkel herum, so in der Art schiefer NPC von Boston. Lieb von Beth, dass sie das in ihrer Beschreibung auf ihrer unsäglichen Doku-Seite sogar erwähnen, inklusive Abhilfe: actor.SetAngle(0, 0, 0). Ein anderer hätte das allerdings gefixt, wenn dieser Fehler schon bekannt ist.

    Edit
    Das mit dem Bar-Händler-Verhalten konnte ich den Wachen austreiben. Es ist tatsächlich jeder NPC in der Händler-Fraktion, nur mit einem Rank von -1(=inaktiv). Frage jetzt auf Faction-Rank > -1 ab. Das deutet ebenfalls drauf hin, dass die Packages nicht in der richtigen Reihenfolge ausgewertet werden. Zu dem Zeitpunkt, wo das abgefragt wird, müsste einer schon ein Wach-Package aktiv haben, wenn das so wäre wie die Reihenfolge im Alias, das jedem Siedler aufgedrückt wird.
    Interessanterweise kriegt jetzt die Wache das Default-Package(sandboxe, wo du gerade bist), weil überhaupt keine andere Condition jemals wahr wird, obwohl sie es nach meiner Log-Ausgabe sollte.

  10. #810
    Not my president Avatar von Boïndil
    Registriert seit
    20.07.2008
    Ort
    Vaullt 101
    Beiträge
    12.056
    Gamer IDs

    Gamertag: PixelMurder

    Standard

    Das glaube ich jetzt aber nicht. Ich lade einen Save in der Mitte von Sanctuary und schlagartig laufen alle Siedler zu ihrem richtigen Posten, die vorher nur blöd herum lungerten.

    Ich habe ja noch gedacht, dass die Siedler von Sanctuary anders funktionieren, als die in Red Rocket. Beim Red Rocket haben alle Siedler normal gearbeitet und geschlafen, abgesehen von den Wachen, die gezickt haben. In Sanctuary war hingegen niemand am Posten und ging auch nie schlafen, den Grund habe ich jetzt herausgefunden. Und zwar war der Sandbox-Area-Trigger, mit dem alle Siedler verlinkt sind und in dessen Grenzen sie sich bewegen können, 2000 Einheiten unter dem Boden, völlig unerreichbar. Möglicherweise habe ich den mal selbst unter den Boden geschoben, weil man in einem Areal voller Trigger kaum noch arbeiten kann, wahrscheinlich habe ich dann vergessen, den wieder an den richtigen Ort zu schieben.

    Es gibt auf jeden Fall mindestens drei Gründe, wieso ein Actor nicht das tut, was man von ihm erwartet:
    -das Package wird nicht aktiv, weil die Conditions nicht zutreffen, die fehlerhaft sein können
    -das Package hat als Ziel ein Linked Ref, der Actor ist aber nicht verlinkt
    -der Actor findet den Weg zum Ziel nicht

    Edit
    Jetzt habe ich ja Zeit, an meinen Encountern weiter zu schleifen, nachdem die Siedler wieder einigermassen funktionieren. Habe schon an die dreissig Actors als Templates oder Spawn erzeugt, mit an die fünfzig Packages, dazu zwei Spawn-Quests, die eine ist für normale Reisende, die andere für Karawanen gedacht.

Seite 81 von 82 ErsteErste ... 317179808182 LetzteLetzte

Berechtigungen

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