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:
Nun kommt der Auslöser für den Job. Leider hab ich keine Idee wie der zufällig ausgelöst werden sollCode: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) --- endDaher wird derzeit bei JEDEM Wechsel in den Regen ein Gewitter ausgelöst.
Der eigentliche Job darf im Skript natürlich nicht fehlen, derzeit aber sind die testwerte vllt. zu krassCode:----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 --die Erklärungen zu einzelnen Werten folgt später.
Mit enthalten sind die Spezialeffekte, wie der andauernde Regen, der aber verbesserungswürdig ist.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
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.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 -----------------------------------------
Kritik, Vorschläge und Kommentare sind erwünscht!
LG Emzet





LinkBack URL
Über LinkBacks
Daher wird derzeit bei JEDEM Wechsel in den Regen ein Gewitter ausgelöst.
Zitieren




Lesezeichen