Ergebnis 1 bis 6 von 6
  1. #1
    Planierer Avatar von Emzet
    Registriert seit
    17.05.2008
    Ort
    Solingen
    Beiträge
    47
    Downloads
    0
    Uploads
    0

    Standard Codefragment Gewitter

    Hallo Leute!

    Da ich in letzter Zeit keine Map veröffentlicht habe wegen graka-schwierigkeiten, hab ich mich entschlossen ein Codefragment zu vervollständigen. Es ist eine gemeine Funktion, die den Spieler beim Siedlungsbau stören soll

    Hier zunächst was als erstes in die FMA muss:
    Code:
    function FirstMapAction()
    math.randomseed(GUI.GetTimeMS()) --- für Zufallswerte
    -------------
        gvBuildingTypes = {}
        gvPlayerBuildings = {}
        gvUnderConstruction = {}
        GetAllExistingBuildingsOnGameStart()
        Trigger.RequestTrigger( Events.LOGIC_EVENT_ENTITY_CREATED, "", "ActionOnEntityCreated", 1)
        Trigger.RequestTrigger( Events.LOGIC_EVENT_ENTITY_DESTROYED, "", "ActionOnEntityDestroyed", 1)
        --[[
        -- Optional für Gebäude-Upgrades
        GameCallback_OnBuildingUpgradeCompleteOrig = GameCallback_OnBuildingUpgradeComplete
            GameCallback_OnBuildingUpgradeComplete = function (_oldId, _newId)
                GameCallback_OnBuildingUpgradeCompleteOrig(_oldId, _newId)
    --            Message("Upgrade Building complete! Old-Id: ".._oldId.." - New-Id: ".._newId)
            end
    --]]
        -- hier folgt dann der weitere Code in der FMA
        --start der unwetterfunktion
         Trigger.RequestTrigger( Events.LOGIC_EVENT_WEATHER_STATE_CHANGED, nil, "Unwetterausloeser", 1)
         ---
    end
    Nun kommt der Auslöser für den Job. Leider hab ich keine Idee wie der zufällig ausgelöst werden soll Daher wird derzeit bei JEDEM Wechsel in den Regen ein Gewitter ausgelöst.
    Code:
    ----der unwetter-auslöser
    --leider noch buggy
    --wird sofort ausgelöst
    function Unwetterausloeser()
    local oldweatherID =    Event.GetOldWeatherState()
    local newweatherID =    Event.GetNewWeatherState()
    if newweatherID == 2 then
    --    if not JobIsRunning(unwetterJob_ID) then
            local wahrscheinlichkeit = math.random(1,100)
                --if 75 >= wahrscheinlichkeit then
                    Message("Ausloeser")
                    AddPeriodicRain(60 * 4)
                    unwetterJob_ID       = StartSimpleJob("UnwetterJob")
                    EffektunwetterJob_ID = StartSimpleJob("Gewitterregeneffekt")
                end 
    --        end
        --end    
    end
    --
    Der eigentliche Job darf im Skript natürlich nicht fehlen, derzeit aber sind die testwerte vllt. zu krass die Erklärungen zu einzelnen Werten folgt später.
    Code:
    ---der unwetterjob
    function UnwetterJob()
        if Counter.Tick2("UnwetterJobtimer", 60) then
            if ( Logic.GetWeatherState() == 2 ) then
                Sound.PlayGUISound(Sounds.Military_SO_CannonTowerFire_rnd_2, 0)
                for i = table.getn(gvPlayerBuildings), 1, -1 do
                    local health = Logic.GetEntityHealth(gvPlayerBuildings[i])
                    local buildpos = GetPosition(gvPlayerBuildings[i])
                    local id,ranpercent = gvPlayerBuildings[i],math.random(1,100)
                        if ranpercent >= 50 then
                            local id,deathercent = gvPlayerBuildings[i], math.random(1,100)
                            if deathercent >= 95  then
                                Logic.CreateEffect( GGL_Effects.FXExplosionShrapnel, buildpos.X, buildpos.Y, 1 )
                                Logic.CreateEffect( GGL_Effects.FXLightning, buildpos.X, buildpos.Y, 1 )
                                Logic.CreateEffect( GGL_Effects.FXLightning, buildpos.X, buildpos.Y, 1 )
                                Sound.PlayGUISound(Sounds.Military_SO_CannonTowerFire_rnd_2, 0)
                                Camera.FollowEntity(id)
                                SetHealth(id,0)
                            elseif 95 >= deathercent then
                                Logic.CreateEffect( GGL_Effects.FXExplosionShrapnel, buildpos.X, buildpos.Y, 1 )
                                Logic.CreateEffect( GGL_Effects.FXLightning, buildpos.X, buildpos.Y, 1 )
                                Logic.CreateEffect( GGL_Effects.FXLightning, buildpos.X, buildpos.Y, 1 )
                                Sound.PlayGUISound(Sounds.Military_SO_CannonTowerFire_rnd_2, 0)
                                Camera.FollowEntity(id)
                                Logic.HurtEntity(id, health/4)
                            end
                        end
                    end
                elseif ( Logic.GetWeatherState() == 3 ) or ( Logic.GetWeatherState() == 1 ) then    
                    EndJob(Effektunwetter_ID)
                return true
            end
        end
    end
    ---spezialeffekte
    function Gewitterregeneffekt() 
        if Counter.Tick2( "heftigerRegen", 5) then
            if ( Logic.GetWeatherState() == 2 ) then
                Sound.PlayGUISound(Sounds.AmbientSounds_rainheavy, 0)
            end
        end
    end
    Mit enthalten sind die Spezialeffekte, wie der andauernde Regen, der aber verbesserungswürdig ist.

    Code:
    ----------Comfort
    --GetAllPlayerBuildings
    function ActionOnEntityCreated()
        local createdEntityId = Event.GetEntityID()
        if Logic.IsBuilding(createdEntityId) == 1 and GetPlayer(createdEntityId) == 1 and gvBuildingTypes[Logic.GetEntityType(createdEntityId)] then
            if Logic.IsConstructionComplete(createdEntityId) ~= 1 then
                table.insert(gvUnderConstruction, createdEntityId)
                if JobIsRunning(JobId_ConstructionComplete) ~= 1 then
                    JobId_ConstructionComplete = StartSimpleJob("Job_ConstructionComplete")
                end
            else
                table.insert(gvPlayerBuildings, createdEntityId)
            end
        end
        return
    end
    function ActionOnEntityDestroyed()
        local destroyedEntityId = Event.GetEntityID()
        if Logic.IsBuilding(destroyedEntityId) == 1 and GetPlayer(destroyedEntityId) == 1 and gvBuildingTypes[Logic.GetEntityType(destroyedEntityId)] then
            for i = table.getn(gvPlayerBuildings), 1, -1 do
                if destroyedEntityId == gvPlayerBuildings[i] then
                    table.remove(gvPlayerBuildings, i)
                    return
                end
            end
            for i = table.getn(gvUnderConstruction), 1, -1 do
                if destroyedEntityId == gvUnderConstruction[i] then
                    table.remove(gvUnderConstruction, i)
                    return
                end
            end 
        end
        return
    end
     
    function Job_ConstructionComplete()
        if table.getn(gvUnderConstruction) > 0 then
            for i = table.getn(gvUnderConstruction), 1, -1 do
                if Logic.IsConstructionComplete(gvUnderConstruction[i]) == 1 then
                    table.insert(gvPlayerBuildings, gvUnderConstruction[i])
                    table.remove(gvUnderConstruction, i)
                end
            end
        else  
            EndJob(JobId_ConstructionComplete)
        end
    end
     
    function GetAllExistingBuildingsOnGameStart()
        table.foreach(Entities, function(key,value)
            if string.find(key, "PB_") then
                gvBuildingTypes[value] = true
                local temp = {Logic.GetPlayerEntities(1, value,1)}
                if temp[1] > 0 then
                    local latestEntity = temp[2]
                    for i = 1, Logic.GetNumberOfEntitiesOfTypeOfPlayer(1, value) do
                        latestEntity = Logic.GetNextEntityOfPlayerOfType(latestEntity);
                        if latestEntity ~= 0 then
                            table.insert(gvPlayerBuildings , latestEntity)
                       end
                    end
                end
            end
        end)
    end
    -----------------------------------------
    Nun dies ist der Code. Jeder kann ihn frei verwenden, wie es ihm gefällt. Nur muss er dabei ein bisschen noch rumschrauben. Ich werde mich später nochmal mit dem Code befassen, besonders mit dem Zufallereignis.

    Kritik, Vorschläge und Kommentare sind erwünscht!

    LG Emzet

  2. #2
    Lanzenträger Avatar von trabbi
    Registriert seit
    09.03.2006
    Beiträge
    4,967
    Downloads
    1
    Uploads
    0

    Standard AW: Codefragment Gewitter

    Zitat Zitat von Emzet Beitrag anzeigen

    Nun kommt der Auslöser für den Job. Leider hab ich keine Idee wie der zufällig ausgelöst werden soll
    wie wärs mir einem zeitlichen random 1-10 min
    trabbi
    Was ist Theorie, - Wenns klappen soll und es klappt nie
    Was ist Praxis, - Frag nicht so dumm, wenns klappt und Du weißt nicht warum

  3. #3
    Planierer Avatar von Emzet
    Registriert seit
    17.05.2008
    Ort
    Solingen
    Beiträge
    47
    Downloads
    0
    Uploads
    0

    Standard AW: Codefragment Gewitter

    Zitat Zitat von trabbi Beitrag anzeigen
    wie wärs mir einem zeitlichen random 1-10 min
    Hi trabbi!
    Das Zeitintervall wär nicht schlecht und schnell machbar. Naja ich hatte auch ursprünglich vor, dass das Gewitter zufällig beim einsetzen von Regen beginnt. In InitWeather() wird an ein paar Stellen AddRain() hinzugefügt und an den Stellen kann das Gewitter beginnen. Nur scheint der Trigger keine Zufallsabfrage vertragen zu können oder ich bin schon raus aus lua

    Naja danke für den Tipp!

  4. #4
    Lanzenträger Avatar von trabbi
    Registriert seit
    09.03.2006
    Beiträge
    4,967
    Downloads
    1
    Uploads
    0

    Standard AW: Codefragment Gewitter

    oder mal anders gesagt:
    wenn das Gewitter einsetzt, kann es ja auch anfangen zu Regnen.
    Diese Regenzeit denn aber nicht zu lange ansetzen.
    Sonst gibts womöglich Überschneidungen.
    trabbi
    Was ist Theorie, - Wenns klappen soll und es klappt nie
    Was ist Praxis, - Frag nicht so dumm, wenns klappt und Du weißt nicht warum

  5. #5
    Planierer Avatar von Emzet
    Registriert seit
    17.05.2008
    Ort
    Solingen
    Beiträge
    47
    Downloads
    0
    Uploads
    0

    Standard AW: Codefragment Gewitter

    Zitat Zitat von trabbi Beitrag anzeigen
    oder mal anders gesagt:
    wenn das Gewitter einsetzt, kann es ja auch anfangen zu Regnen.
    Diese Regenzeit denn aber nicht zu lange ansetzen.
    Sonst gibts womöglich Überschneidungen.
    Hmm... der Regen sollte beim Gewitter schon kommen, denn ein blitz am hellichten tag hab ich bis jetzt noch nicht gesehen

    Ein StartCountdown oder Simplejob gefällt mir nicht so recht, da werde ich mir noch besonderes überlegen, was eher passt. Man könnt die Funktion daran passen, sobald Regen einsetzt, dass das Gewitter folgt und mit dem Regen auch verschwindet. Ich werde das auch mal ausprobieren.

    Emzet

  6. #6
    Lanzenträger Avatar von trabbi
    Registriert seit
    09.03.2006
    Beiträge
    4,967
    Downloads
    1
    Uploads
    0

    Standard AW: Codefragment Gewitter

    Zitat Zitat von Emzet Beitrag anzeigen
    Hmm... der Regen sollte beim Gewitter schon kommen, denn ein blitz am hellichten tag hab ich bis jetzt noch nicht gesehen
    ich schon
    Blitz aus heiterem Himmel ..... danach musste denn die Feuerwehr raus
    trabbi
    Was ist Theorie, - Wenns klappen soll und es klappt nie
    Was ist Praxis, - Frag nicht so dumm, wenns klappt und Du weißt nicht warum

Aktive Benutzer

Aktive Benutzer

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

Ähnliche Themen

  1. Gewitter
    Von mattizwo im Forum S6 Scriptecke
    Antworten: 11
    Letzter Beitrag: 22.09.2008, 18:42

Stichworte

Berechtigungen

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