Seite 79 von 79 ErsteErste ... 2969777879
Ergebnis 781 bis 782 von 782

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

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

    Gamertag: PixelMurder

    Standard

    Mehr Downloads bedeuten auch mehr Bug-Meldungen, auch mehr Bug-Meldungen, die eigentlich keine sind.
    Und manche Mods sind trotz einiger Bugs hervorragende Arbeit, mal abgesehen, dass manche Bugs prinzipbedingte Fehler sind, die man überhaupt nicht fixen kann oder nur mit unverhältnismässigem Aufwand. Hinzu kommt, dass manche tolle Mesher sind, aber einfach clippende Animationen von der Stange nehmen müssen, weil man einfach nicht alles selbst kann.

    Übrigens zocke ich auch wirklich ausgiebig und habe oft meinen Spass daran, ob es beim Bauen oder beim Ghul-Knüppeln ist. Okay, anschliessend habe ich wieder zwei A4-Bätter mit Verbesserungswüsnchen vollgekritzelt.

    Im Moment bin ich gerade daran, die Packages der Siedler zu verbessern, damit sie nie wie die Ölgötzen da stehen(das ist ein Bug oder auch einfach nur unfertig). Ausserdem hatte ich gestern die Idee, Libertalia zur vollwertigen Siedlung zu machen, nachdem ich jetzt schon positive Erfahrung mit Thicket Excavations gemacht habe, wo es auf keinen Fall schlechter läuft, als in Vanilla.
    Ticket Excavations ist schon die grösste und gleichzeitig höchste Siedlung des Spiels, aber Libertalia ist noch grösser und mindestens ebenso episch. Da kann ich dann ein wenig Waterworld spielen

    Edit
    So sieht übrigens das Workshop-System aus, das hier kann ich im Prinzip in eine potentielle Siedlung kopieren und da konfigurieren.

    Die zwei gelben Blöcke sind die Bau-Grenzen, die kann ich überlappend positionieren und auf die richtige Grössse bringen, und kann dann innerhalb bauen. Libertalia ist etwa recht lang und hat komische Grenzen, da braucht vielleicht noch einen oder zwei Blöcke mehr, um das nachzubilden.
    Der grüne Block ist die Sandbox-Grenze für die Siedler, da reicht einer, das muss nicht genau sein.
    Dann gibts den XMarker, der das Zentrum der Siedlung definiert, dahin gehen Karawanen und alle Packages beziehen sich darauf. Beim Spanwmarker werden neue Siedler oder Überfälle gespawnt.
    Die Werkbank ist auch mit einem Ressourcen-Container verlinkt, der vom System benötigt wird. Dann als Deko verlinkte Werkbänke. Entwder kann ich noch mehr anhängen oder bestehende löschen, falls nicht notwednig.

    Links oben ist meine Erweiterung, ein blauer Aktivator, der mit zwei Spawnmarkern verlinkt ist, wo Kleinzeug gespanwt wird, um ab und zu die Siedler auf Vordermann zu bringen oder irgendwann mal auch grössere Feinde zu spawnen. Der Aktivator enthält auch ein Script, das ich im Editor-Fenster konfigurieren kann: Wer muss getötet werden, welche Quest muss erfüllt sein, um den Workshop freizuschalten. Das Script wird ständig duchlaufen, um Siedlungseigenschaften und anderes Zeug zu kontrollieren, auch en Workshop zu debuggen.
    Ziemlich geil. Mit dem Aktivator kann ich im Prinzip auf sämtliche öffentliche Variablen und Funktionen eines Workshops zugreifen, ob es ein bestehender oder neuer Workshop ist. Der fügt den Workshop auch per Script in die Liste ein, damit man Karawanenwege damit machen kann, das funktioniert wie mit DLC.

    Nochmals Edit
    Hier mein neues hübsches Script zum Überwachen eines Workshops, das ich nächstens austesten gehe.
    Geplant sind schon Überfälle, aber zuerst muss mal die Basis laufen.

    Scriptname THEW:THEWWorkshopController extends ObjectReference

    Spoiler:
    Code:
    Group Common
        Actor Property Player Auto Const Mandatory
        WorkShopScript Property MyWorkShop Auto Const Mandatory
        GlobalVariable Property GameDaysPassed Auto Const Mandatory
        GlobalVariable Property GameHour Auto Const Mandatory
    EndGroup
    
    Group Unlock
        Bool Property UnlockWhenCleared = true Auto Const
        ObjectReference[] Property ActorRefsToKill Auto Const Mandatory
        Quest[] Property QuestsToComplete Auto Const Mandatory
    EndGroup
    
    Group Annoyance
        Float Property AnnoyanceIntervalDays = 0.3 Auto Const
        ActorBase[] Property AnnoyanceActors Auto Const
        ObjectReference[] Property AnnoyanceMarker Auto Const Mandatory
    EndGroup
    
    Group Enemies
        Float Property EnemyIntervalDays = 1.5 Auto Const
        ActorBase[] Property EnemyActorsBoss Auto Const
        ActorBase[] Property EnemyActorsKnight Auto Const
        ActorBase[] Property EnemyActorsGeneral Auto Const
        ActorBase[] Property EnemyActorsPet Auto Const
        ObjectReference[] Property SpawnEnemyMarker Auto Const
    EndGroup
    
    bool sysInitialized         = false
    bool workShopInitialized     = false
    float sysInterval             = 60.0
    int updateTimerId            = 1
    float updateInterval        = 0.1
    int annoyanceTimerId        = 2
    float minAnnoyanceDay        = 0.2
    float maxAnnoyanceDay        = 0.5
    float annoyanceDay            = 0.0
    int attackTimerId            = 3
    float minAttackDay            = 1.5
    float maxAttackDay            = 3.0
    float attackDay            = 0.0
    bool actorRefsKilled         = false
    bool questsCompleted        = false
    bool locationCleared        = false
            
    Event OnLoad()
        DebugTrace("Workshop Controller loaded")
        if sysInitialized == false    
            sysInitialized = true
            DebugTrace("Workshop Controller initialized")
            MonitorWorkshop()
        endif
        if workShopInitialized == true
            ; Do something
        endif
    EndEvent
    
    Event OnTimer(int aiTimerID)
        MonitorWorkshop()
    EndEvent
    
    Event OnTimerGameTime(int aiTimerID)
        if aiTimerId == updateTimerId
            UpdateWorkshop()
        elseif aiTimerId == annoyanceTimerId
            SpawnAnnoyance()
        elseif aiTimerId == attackTimerId
            SpawnEnemy()
        endif
    EndEvent
    
    ; Monitor workshop location until all conditions are met
    Function MonitorWorkshop()
        if workShopInitialized == false && WorkshopCanBeInitialized()
            DebugTrace("Workshop unlocked")
            workShopInitialized = true
            StartTimerGameTime(updateInterval, updateTimerId)
            StartTimerGameTime(Utility.RandomFloat(minAnnoyanceDay, maxAnnoyanceDay), annoyanceTimerId)
            StartTimerGameTime(Utility.RandomFloat(minAttackDay, maxAttackDay), attackTimerId)
        else
            StartTimer(sysInterval)
        endif
    EndFunction
    
    Function UpdateWorkshop()
        ; Do something
        StartTimerGameTime(updateInterval, updateTimerId)
    EndFunction
    
    Function SpawnAnnoyance()
        debugTrace("Annoyance spawned")
        if AnnoyanceActors.Length > 0
            int spawnType = 0
            if  AnnoyanceActors.Length > 1
                spawnType = Utility.RandomInt(0, AnnoyanceActors.Length - 1)
            endif
            ObjectReference spawnedActor
            ObjectReference spawnMarker = GetSpawnMarker()
            spawnedActor = spawnMarker.PlaceAtMe(AnnoyanceActors[spawnType], 1)
            spawnedActor.SetLinkedRef(self)
        endif
        StartTimerGameTime(Utility.RandomFloat(minAnnoyanceDay, maxAnnoyanceDay), annoyanceTimerId)
    EndFunction
    
    Function SpawnEnemy()
        debugTrace("Enemies spawned")
        ; To Do
        StartTimerGameTime(Utility.RandomFloat(minAttackDay, maxAttackDay), attackTimerId)
    EndFunction
    
    Bool Function PlayerIsNearby()
        bool nearBy = GetDistance(Game.GetPlayer()) < 2500
        return nearBy
    EndFunction
    
    Bool Function WorkshopCanBeInitialized()
        if actorRefsKilled == false
            if ActorRefsToKill.Length > 0
                int killCount = 0
                while (c < ActorRefsToKill.Length)
                    if (ActorRefsToKill[c] as Actor).IsDead()
                        killCount += 1
                    endif
                    c += 1
                endwhile
                if killCount == ActorRefsToKill.Length
                    DebugTrace("All actors killed")
                    actorRefsKilled = true
                endif
            else
                DebugTrace("No actor to kill")
                actorRefsKilled = true
            endif
        endif
        if questsCompleted == false
            if QuestsToComplete.Length > 0
                int questCount = 0
                while (c < QuestsToComplete.Length)
                    if QuestsToComplete[c].IsCompleted()
                        questCount += 1
                    endif
                    c += 1
                endwhile
                if questCount == QuestsToComplete.Length
                    DebugTrace("All quests completed")
                    questsCompleted = true
                endif
            else
                DebugTrace("No quest to complete")
                questsCompleted = true
            endif
        endif
        if UnlockWhenCleared
            if GetCurrentLocation().IsCleared()
                DebugTrace("Location cleared")
                locationCleared = true
            endif
        else
            DebugTrace("No location to clear")
            locationCleared = true
        endif
        if actorRefsKilled && questsCompleted && locationCleared
            DebugTrace("All quests completed, all actors killed, location cleared")
            return true
        else
            return false
        endif
    EndFunction
    
    ObjectReference Function GetSpawnMarker()
        int c = 0
        float  highestDistance = 0
        ObjectReference spawnMarker
        while (c < SpawnMarkerList.Length)
            if SpawnMarkerList[c].GetDistance(Game.GetPlayer()) > highestDistance
                highestDistance = SpawnMarkerList[c].GetDistance(Game.GetPlayer())
                spawnMarker = SpawnMarkerList[c]
            endif
            c += 1
        endwhile
        return spawnMarker
    EndFunction
    
    Function DebugTrace(string text)
        Debug.Trace("THEW DEBUG - Workshop Controller - Workshop: " + MyWorkShop + " - " + text)
    EndFunction
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken Klicke auf die Grafik für eine größere Ansicht 

Name:	_settlement-system.jpg 
Hits:	12 
Größe:	113,2 KB 
ID:	22765  

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

    Gamertag: PixelMurder

    Standard

    Hah, alles mein

    Okay, noch nicht ganz, da fehlt noch was, wie ich beim Auswerten der Logs gemerkt habe. Der Shop würde zwar funktionieren, ist aber noch nicht richtig mit der WorkshopParentQuest verlinkt, die alle Siedlungen in einem Array haben muss, um sie kontrolieren und updaten zu können. Dieser Array wird automatisch erstellt, wenn man einen neuen Durchgang beginnt, alle Locations mit gewissen Keywords und einer Workbench werden automatisch ermittelt. Desahlb funktioniert auch Thicket Excavations einwandfrei, weil die Siedlung beim Neustart schon drin war.
    Zum Glück kann ich beim Workshop-DLC abkupfern, wie man Sieldungen nachträglich hinzufügt, das ist eine einfache Funktion, die ich von meinem Aktivator-Script auf WorkshopParent aufrufen kann.

    Die Siedlung ist zwar richtig episch, wird aber ihre Macken haben. Curie habe ich oft schwimmen sehen, die Stege da sind einfach zu eng und der Weg zum Siedlungszentrum ist tatsächlich unterbrochen: entweder muss man den Lift nehmen oder schwimmen. Mal sehen, ob ich das im Baumodus verbessern kann, wenn ich vorhandene Stege breiter mache und neue hinzufüge.

    Ausserdem ist die Performance da relativ schlecht, ich vermute, dass das an den schwimmenden Plattformen liegt, die sich heben und senken. Das ist ein weiteres Problem, damit Objekte sich mit den Plattformen bewegen, müssen sie im Plattform-Obbjekt eingeklinkt sein, das geht nur im Editor. Aber okay, hat auch so genug Platz da, wie man in den Screenshots sieht.

    Edit
    So, hier das neue Script, das ich gleich testen gehe... Aber erst, wenn ich die Bootstexturen debugt habe, das gönne ich mir noch davor, da ich nicht auf schwammiges Zeug stehe.

    Scriptname THEW:THEWWorkshopController extends ObjectReference

    Spoiler:
    Code:
    Group Flags
        Bool Property IsNewWorkshop = true Auto Const
        { If set to true, this workshop will be added to the workshop parent quest. Generally used for newly installed settlements. }
        Bool Property UnlockWhenAble = true Auto Const
        { If set to true, this workshop will be unlocked from this script when all conditions are met. Generally used for newly installed settlements.}
    EndGroup
    
    Group Data
        Actor Property Player Auto Const Mandatory
        WorkShopParentScript Property WorkShopParent Auto Const Mandatory
        WorkShopScript Property WorkShop Auto Const Mandatory
        GlobalVariable Property GameDaysPassed Auto Const Mandatory
        GlobalVariable Property GameHour Auto Const Mandatory
        ObjectReference[] Property AttackMarker Auto Const Mandatory
    EndGroup
    
    Group UnlockConditions
        Bool Property UnlockWhenCleared = false Auto Const
        ObjectReference[] Property ActorRefsToKill Auto Const
        Quest[] Property QuestsToComplete Auto Const
        Quest:QuestStage[] Property QuestStagesToComplete Auto Const
    EndGroup
    
    Group AnnoyanceSytem
        ActorBase[] Property AnnoyanceActors Auto Const
    EndGroup
    
    Group AttackSystem
        WorkshopAttack[] Property WorkshopAttacks Auto Const
    EndGroup
    
    bool sysInitialized             = false
    bool workShopInitialized         = false
    float sysInterval                 = 60.0
    int updateTimerId                = 1
    float updateInterval            = 0.25
    int annoyanceTimerId            = 2
    float minAnnoyanceDay            = 1.0
    float maxAnnoyanceDay            = 1.5
    float annoyanceDay                = 0.0
    int attackTimerId                = 3
    float minAttackDay                = 7.0
    float maxAttackDay                = 12.0
    float attackDay                = 0.0
    bool actorRefsKilled             = false
    bool questsCompleted            = false
    bool questStagesCompleted         = false
    bool locationCleared            = false
    
    Struct WorkshopAttack
        Bool NightOnly = false
        Bool IsHardcore = false
        ActorBase EnemyActorsBoss
        ActorBase EnemyActorsKnight
        ActorBase EnemyActorsGeneral
        ActorBase EnemyActorsPet
    EndStruct
            
    Event OnLoad()
        DebugTrace("Workshop Controller loaded")
        if sysInitialized == false    
            sysInitialized = true
            RegisterkWorkshop()
            MonitorWorkshop()
        endif
        if workShopInitialized == true
            ; Do something
        endif
    EndEvent
    
    Event OnTimer(int aiTimerID)
        MonitorWorkshop()
    EndEvent
    
    Event OnTimerGameTime(int aiTimerID)
        if aiTimerId == updateTimerId
            UpdateWorkshop()
        elseif aiTimerId == annoyanceTimerId
            SpawnAnnoyance()
        elseif aiTimerId == attackTimerId
            SpawnEnemy()
        endif
    EndEvent
    
    ; Monitor workshop location until all conditions are met
    Function MonitorWorkshop()
        if workShopInitialized == false && WorkshopCanBeInitialized()
            workShopInitialized = true
            UnlockWorkshop()
            StartTimerGameTime(updateInterval, updateTimerId)
            StartTimerGameTime(Utility.RandomFloat(minAnnoyanceDay, maxAnnoyanceDay), annoyanceTimerId)
            StartTimerGameTime(Utility.RandomFloat(minAttackDay, maxAttackDay), attackTimerId)
        else
            StartTimer(sysInterval)
        endif
    EndFunction
    
    Function UpdateWorkshop()
        ; Do something
        StartTimerGameTime(updateInterval, updateTimerId)
    EndFunction
    
    Function RegisterkWorkshop()
        DebugTrace("Trying to register workshop")
        if IsNewWorkshop
            WorkshopScript[] newWorkshops = new WorkshopScript[0]
            newWorkshops.Add(WorkShop)
            ; add new workshops to main workshop arrays
            if WorkshopParent.ReinitializeLocationsPUBLIC(newWorkshops, self) == false
                ; no locations to initialize - we're done (otherwise we wait for WorkshopInitializeLocation event sequence to complete)
                DebugTrace("Workshop registered")
            endif
        endif
    EndFunction
    
    Function UnlockWorkshop()
        DebugTrace("Workshop unlocked")
        if WorkShop.OwnedByPlayer == false && UnlockWhenAble == true
            WorkShop.SetOwnedByPlayer(true)
        endif
    EndFunction
    
    Function SpawnAnnoyance()
        debugTrace("Annoyance spawned")
        if AnnoyanceActors.Length > 0
            int spawnType = 0
            if  AnnoyanceActors.Length > 1
                spawnType = Utility.RandomInt(0, AnnoyanceActors.Length - 1)
            endif
            ObjectReference spawnedActor
            ObjectReference spawnMarkerRef = GetSpawnMarker()
            spawnedActor = spawnMarkerRef.PlaceAtMe(AnnoyanceActors[spawnType], 1)
            spawnedActor.SetLinkedRef(self)
        endif
        StartTimerGameTime(Utility.RandomFloat(minAnnoyanceDay, maxAnnoyanceDay), annoyanceTimerId)
    EndFunction
    
    Function SpawnEnemy()
        debugTrace("Enemies spawned")
        ; To Do
        StartTimerGameTime(Utility.RandomFloat(minAttackDay, maxAttackDay), attackTimerId)
    EndFunction
    
    Bool Function PlayerIsNearby()
        bool nearBy = GetDistance(Game.GetPlayer()) < 2500
        return nearBy
    EndFunction
    
    Bool Function WorkshopCanBeInitialized()
        int c = 0
        if WorkShop.OwnedByPlayer == true
            return true
        endif
        if actorRefsKilled == false
            if ActorRefsToKill.Length > 0
                int killCount = 0
                c = 0
                while (c < ActorRefsToKill.Length)
                    if (ActorRefsToKill[c] as Actor).IsDead()
                        killCount += 1
                    endif
                    c += 1
                endwhile
                if killCount == ActorRefsToKill.Length
                    DebugTrace("All actors killed")
                    actorRefsKilled = true
                endif
            else
                DebugTrace("No actor to kill")
                actorRefsKilled = true
            endif
        endif
        if questsCompleted == false
            if QuestsToComplete.Length > 0
                int questCount = 0
                c = 0
                while (c < QuestsToComplete.Length)
                    if QuestsToComplete[c].IsCompleted()
                        questCount += 1
                    endif
                    c += 1
                endwhile
                if questCount == QuestsToComplete.Length
                    DebugTrace("All quests completed")
                    questsCompleted = true
                endif
            else
                DebugTrace("No quest to complete")
                questsCompleted = true
            endif
        endif
        if questStagesCompleted == false
            if QuestStagesToComplete.Length > 0
                int questStagesCount = 0
                c = 0
                while (c < QuestStagesToComplete.Length)
                    if (QuestStagesToComplete[c].QuestToSet as Quest).IsStageDone(QuestStagesToComplete[c].StageToSet)
                        questStagesCount += 1
                    endif
                    c += 1
                endwhile
                if questStagesCount == QuestStagesToComplete.Length
                    DebugTrace("All quests stages completed")
                    questStagesCompleted = true
                endif
            else
                DebugTrace("No quest stages to complete")
                questStagesCompleted = true
            endif
        endif
        if locationCleared == false
            if UnlockWhenCleared
                if GetCurrentLocation().IsCleared()
                    DebugTrace("Location cleared")
                    locationCleared = true
                endif
            else
                DebugTrace("No location to clear")
                locationCleared = true
            endif
        endif
        if actorRefsKilled && questsCompleted && questStagesCompleted  && locationCleared
            DebugTrace("All quests and quest stages completed, all actors killed, location cleared")
            return true
        else
            return false
        endif
    EndFunction
    
    ObjectReference Function GetSpawnMarker()
        int c = 0
        float  highestDistance = 0
        ObjectReference spawnMarkerRef
        while (c < AttackMarker.Length)
            if AttackMarker[c].GetDistance(Game.GetPlayer()) > highestDistance
                highestDistance = AttackMarker[c].GetDistance(Game.GetPlayer())
                spawnMarkerRef = AttackMarker[c]
            endif
            c += 1
        endwhile
        return spawnMarkerRef
    EndFunction
    
    Function DebugTrace(string text)
        Debug.Trace("THEW DEBUG - Workshop Controller - Workshop: " + WorkShop + " - " + text)
    EndFunction
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken Klicke auf die Grafik für eine größere Ansicht 

Name:	Fallout4-2017-04-21-15-28-52-133.jpg 
Hits:	13 
Größe:	108,3 KB 
ID:	22768   Klicke auf die Grafik für eine größere Ansicht 

Name:	Fallout4-2017-04-21-15-29-13-651.jpg 
Hits:	13 
Größe:	76,6 KB 
ID:	22769   Klicke auf die Grafik für eine größere Ansicht 

Name:	Fallout4-2017-04-21-19-16-39-422.jpg 
Hits:	11 
Größe:	64,8 KB 
ID:	22770   Klicke auf die Grafik für eine größere Ansicht 

Name:	Fallout4-2017-04-21-20-03-07-421.jpg 
Hits:	12 
Größe:	118,3 KB 
ID:	22771  

Seite 79 von 79 ErsteErste ... 2969777879

Berechtigungen

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