Siedlungsplätze bauen und Leibeigene aus DZs
» Siedler Map Source Forum » Siedler DEdK Script Forum » Siedlungsplätze bauen und Leibeigene aus DZs
Seiten: 1
Play4FuN
|
#1 15.11.2014 13:59 Beiträge: 704 |
Siedlungsplätze bauen und Leibeigene aus DZs
Hallo Leute,
wie bereits in diesem Screenshot angekündigt, möchte ich Euch hier eine Arbeit meinerseits vorstellen.
Der folgende Code erlaubt es dem Spieler selbst Siedlungsplätze zu errichten (die anschließend ganz normal besetzt werden können) und außerdem Leibeigene auch aus DZs kaufen zu können.
Es handelt sich um keine große Sache, ich dachte jedoch es wäre nett, es interessierten Mappern zur Verfügung zu stellen - vielleicht findet Ihr ja Verwendung dafür. Ihr könnt dieses Skript also gerne nutzen.
In die InitPlayerColorMapping kommt folgendes:
-- Leibeigene im DZ kaufen XGUIEng.TransferMaterials("Buy_Serf",971) -- Außenposten --> Siedlungsplatz XGUIEng.ShowWidget(XGUIEng.GetWidgetID("Build_Outpost"),1) XGUIEng.SetWidgetPosition(XGUIEng.GetWidgetID("Build_Outpost"),323,40) for i=1,4 do XGUIEng.SetMaterialColor("Build_Outpost",(i-1),160,160,255,255) end
Der (einmalige) Funktionsaufruf sieht wie folgt aus:
InitBuildVcMod(Limit,Text1,Text2)
Anwendungsbeispiel:
InitBuildVcMod(4)
Dabei ist der erste Parameter (Limit) eine Zahl, die angibt, wie viele Siedlungsplätze der Spieler maximal bauen darf (Im Anwendungsbeispiel also 4).
Möchte man kein Limit setzen, schreibt man statt einem Wert einfach "false" an die 1. Stelle, dann können so viele gebaut werden, wie Rohstoffe und Platz da sind.
InitBuildVcMod(false)
Möchte man im Spielverlauf (also nachträglich!) das weitere Bauen von Siedlungsplätzen verhinden/deaktivieren, kann man dies auf 2 Arten tun:
VCMOD.Limit = 0
Oder aber so (evtl. sogar besser):
VCMOD.BuildVCallowed = false
Nun zu dem 2. und 3. Parameter. Diese sind beide optional! Text1 ist der Tooltip, der im Leibeigenenmenu angezeigt wird, wenn der Spieler momentan einen Siedlungsplatz bauen kann. Text2 wird dort angezeigt, falls er dies nicht (mehr) darf. (Notiz: Es kann immer noch 1 Siedlungsplatz gleichzeitig gebaut werden)
Ein (nicht unbedingt realistisches) Beispiel:
InitBuildVcMod(3,"Baut einen Siedlungsplatz.","Ihr dürft keinen Siedlungsplatz mehr bauen!")
In diesem Fall darf der Spieler maximal 3 weitere Siedlungsplätze bauen. (Hinweis: Umlaute sollten ohne Probleme verwendet werden können, sofern Ihr die Comfort dazu irgendwo im Skript habt.)
Falls es Probleme/Buggs oder Anregungen etc. gibt, gerne hier in diesen Thread oder per PN an mich!
Hier nun der Code, der weiter ins Skript muss:
function InitBuildVcMod(_limit,_textNormal,_textDisabled) VCMOD = {} VCMOD.BuildVCallowed = true VCMOD.P_Outpost = 0 VCMOD.VCBuild = 0 VCMOD.Replaced = 0 if _limit ~= nil then if type(_limit) == "number" then VCMOD.Limit = _limit if _limit == 0 then VCMOD.BuildVCallowed = false end elseif type(_limit) == "boolean" then if _limit == false then VCMOD.Limit = -1 -- kein Limit end end end if not _textNormal then -- normaler Tooltip VCMOD.TextNormal = "@color:180,180,180 Siedlungsplatz @cr @color:255,255,255 Errichtet einen Siedlungsplatz um Eure Siedlung zu erweitern und mehr Platz für neue Siedler zu schaffen." else VCMOD.TextNormal = Umlaute(_textNormal) end if not _textDisabled then -- Tooltip: keine weiteren Siedlungsplätze! VCMOD.TextDisabled = "@color:180,180,180 Siedlungsplatz @cr @color:255,255,255 Ihr könnt im Moment keinen weiteren Siedlungsplatz bauen." else VCMOD.TextDisabled = Umlaute(_textDisabled) end PlayerBuildVillageCenter() -- Gebäudebau Trigger.RequestTrigger(Events.LOGIC_EVENT_ENTITY_CREATED,"","VCMOD_ON_ENTITY_CREATED",1) BuySerfFromVillageCenter() -- Leibeigene aus Dorfzentren end function PlayerBuildVillageCenter() GUIAction_PlaceBuilding_Orig = GUIAction_PlaceBuilding GUIAction_PlaceBuilding = function( _a) if _a == UpgradeCategories.Outpost then if VCMOD.BuildVCallowed == false then -- es passiert nichts! else if Logic.GetNumberOfEntitiesOfTypeOfPlayer(1,Entities.PB_Outpost1) == 0 then if (VCMOD.VCBuild < VCMOD.Limit) or (VCMOD.Limit == -1) then GUIAction_PlaceBuilding_Orig(_a) end end end else -- anderes Gebäude: wird normal platziert GUIAction_PlaceBuilding_Orig(_a) end end -- Tooltips GUITooltip_ConstructBuilding_Orig = GUITooltip_ConstructBuilding GUITooltip_ConstructBuilding = function(_e1,_e2,_e3,_e4,_e5) GUITooltip_ConstructBuilding_Orig(_e1,_e2,_e3,_e4,_e5) if string.find(_e2,"MenuSerf/outpost_normal") ~= nil then if VCMOD.BuildVCallowed == true then XGUIEng.SetText(gvGUI_WidgetID.TooltipBottomText,VCMOD.TextNormal) else if (Logic.GetNumberOfEntitiesOfTypeOfPlayer(1,Entities.PB_Outpost1) > 0) or ((VCMOD.VCBuild == VCMOD.Limit) and (VCMOD.Limit ~= -1)) or (VCMOD.Limit == 0) then XGUIEng.SetText(gvGUI_WidgetID.TooltipBottomText,VCMOD.TextDisabled) else XGUIEng.SetText(gvGUI_WidgetID.TooltipBottomText,VCMOD.TextNormal) end end end end function Score.OnBuildingConstructionComplete(_BuildingID, _PlayerID) if _PlayerID ~= 0 then -- Zusatz: Punkte werden nur verteilt, wenn die SpielerID gültig ist - nötig um Absturz/Fehler zu vermeiden! Score.Player[_PlayerID]["buildings"] = Score.Player[_PlayerID]["buildings"] + Score.ConstructionPoints Score.Player[_PlayerID]["all"] = Score.Player[_PlayerID]["all"] + Score.ConstructionPoints end end end VCMOD_ON_ENTITY_CREATED = function() local _eId = Event.GetEntityID() local _pId = GetPlayer(_eId) local _eType = Logic.GetEntityTypeName(Logic.GetEntityType(_eId)) if _eType == "PB_Outpost1" then -- Außenposten VCMOD.P_Outpost = _eId VCMOD.BuildVCallowed = false VCMOD.Replaced = 0 StartSimpleJob("CheckIfOutpostCompleted") Logic.SetModelAndAnimSet(_eId,Models.XD_VillageCenter) end end function CheckIfOutpostCompleted() if Logic.IsConstructionComplete(VCMOD.P_Outpost) == 1 then ReplaceEntity(VCMOD.P_Outpost,Entities.XD_VillageCenter) VCMOD.Replaced = 1 VCMOD.VCBuild = VCMOD.VCBuild + 1 if (VCMOD.VCBuild < VCMOD.Limit) or (VCMOD.Limit == -1) then VCMOD.BuildVCallowed = true else VCMOD.BuildVCallowed = false end return true elseif IsDestroyed(VCMOD.P_Outpost) and VCMOD.BuildVCallowed == false then -- Siedlungsplatz wurde zerstört, vor der Fertigstellung if VCMOD.Replaced == 0 then VCMOD.BuildVCallowed = true --VCMOD.Replaced = 0 end return true end end function BuySerfFromVillageCenter() SerfHack = {_used = false, _waittime = 2} SerfHack_OverwriteTechnology() SerfHack_OverwriteTooltip() end function SerfHack_OverwriteTechnology() GUIAction_ReserachTechnology_Orig = GUIAction_ReserachTechnology GUIAction_ReserachTechnology = function(tech) if tech == Technologies.T_TownGuard then local posDZ = GetPosition(GUI.GetSelectedEntity()) local places = (Logic.GetPlayerAttractionLimit(1) - Logic.GetPlayerAttractionUsage(1)) if GetGold(1) > 49 then if places > 0 then SetEntityName(Logic.CreateEntity(Entities.XD_ScriptEntity,(posDZ.X)-100,(posDZ.Y)-900,0,8),"TEMP_POS_DZ_MOVE") Move(Logic.CreateEntity(Entities.PU_Serf,(posDZ.X)-200,(posDZ.Y)-650,0,1),"TEMP_POS_DZ_MOVE") DestroyEntity("TEMP_POS_DZ_MOVE") AddGold(1,-50) else SerfHack_FeedbackNotEnoughPlaces() -- keine freien Plätze end else SerfHack_FeedbackNotEnoughGold() -- nicht genug Gold end else GUIAction_ReserachTechnology_Orig(tech) end end end function SerfHack_FeedbackNotEnoughPlaces() if SerfHack._used == false then StartCountdown(SerfHack._waittime,SerfHack_ResetWaitTime,false) Message("Ihr habt keinen Platz mehr in Eurer Siedlung!") Sound.PlayGUISound(Sounds.VoicesMentor_INFO_VillageCenterEmpty_rnd_01,100) SerfHack._used = true end end function SerfHack_FeedbackNotEnoughGold() if SerfHack._used == false then StartCountdown(SerfHack._waittime,SerfHack_ResetWaitTime,false) Message("Ihr habt nicht genug Taler!") Sound.PlayGUISound(Sounds.VoicesMentor_INFO_NotEnoughGold_rnd_01,100) SerfHack._used = true end end function SerfHack_ResetWaitTime() SerfHack._used = false end function SerfHack_OverwriteTooltip() GUITooltip_ResearchTechnologies_orig = GUITooltip_ResearchTechnologies function GUITooltip_ResearchTechnologies(_tech,_widget,_keybind) if (_tech == Technologies.T_TownGuard) then XGUIEng.SetText(gvGUI_WidgetID.TooltipBottomCosts,"Taler: 50") XGUIEng.SetText("TooltipBottomShortCut", "Taste: [Q]") XGUIEng.SetText(gvGUI_WidgetID.TooltipBottomText,"@color:180,180,180 Kauft einen Leibeigenen @cr @color:255,255,255 Ein Leibeigener sammelt Ressourcen, baut und repariert Häuser und kann die Gegend erkunden. Er braucht kein Haus und keinen Bauernhof.") else GUITooltip_ResearchTechnologies_orig(_tech,_widget,_keybind) end end end
Edit: Jetzt steht im Tooltip "Taste: [Q]" auch ordnungsgemäß drinn!
____________________
LG Play4FuN
Siedler DEdK Mapping + Scripting Tutorials
Dieser Beitrag wurde von Play4FuN am 15.11.2014 um 21:20 editiert.
Zedeg
|
#2 15.11.2014 14:33 Beiträge: 428 |
Wie wär's damit:
XGUIEng.SetText("TooltipBottomCosts", "Taler: 50") XGUIEng.SetText("TooltipBottomShortCut", "Taste: [Q]") XGUIEng.SetText("TooltipBottomText", "@color:180,180,180 Kauft einen Leibeigenen @cr @color:255,255,255 Ein Leibeigener sammelt Ressourcen, baut und repariert Häuser und kann die Gegend erkunden. Er braucht kein Haus und keinen Bauernhof.")
____________________
Journalisten erkundigen sich bei Wissenschaftlern meist nicht nach Grundlagen, sondern eher nach Ergebnissen und Folgerungen. Das erklärt womöglich auch, warum sich Forschungsberichte in den Medien so häufig als feststehende Erkenntnisse lesen, nicht aber als Ideen, Entdeckungen oder Indizien, um die es sich genau genommen in den meisten Fällen handelt. -Axel Bojowski
mcb
|
#3 15.11.2014 19:39 Beiträge: 1472 |
Hab mir grad den Quellcode angesehen. Schade das man sie nicht direkt bauen kann... Hab aber noch nen Verbesserungsvorschlag für dich: Du müstest den Job, der den Outpost durch das VillageCenter ersetzt, vermeiden können, indem du GameCallback_OnBuildingConstructionComplete hackst.
totalwarANGEL
|
#4 15.11.2014 19:50 Beiträge: 2123 |
Schöne Leistung, aber ich finde das spanisch. Ist es nicht ein Kernelement, dass der Spieler diese Baustellen suchen muss und sie nicht da platziert wo es ihm passt? So wie ich das mitbekommen habe gibt es ein Baulimit. Na das ist ja schon mal was. Mein Vorschlag wäre diese Bauplätze noch viel teuer zu machen.
____________________
Die Welt ist arschlochförmig und wir leben in der Mitte.
jugl
|
#5 15.11.2014 20:02 Beiträge: 803 |
Hallo twA,
da geb ich dir Recht. Das ist ein Kernelement des Spiels. Entweder suchen und bauen, oder gegenerischer DZ erobern und besetzen, es sei denn, der Mapper ist so gemein, gegnerische DZ zu verstecken .
Auf der anderen Seite könnte das ein Anreiz sein, wenn der Spieler einmalig über Questerfüllung ein zusätzliches DZ am Ort seiner Wahl bauen darf.
____________________
Si tus vi late, in isse tabernit.
Play4FuN
|
#6 15.11.2014 20:13 Beiträge: 704 |
@twA & jugl:
Meine Ideen gingen eher in Richtung Jugl's Vorschlag mit der Questerfüllung und natürlich sind die Limits dafür wichtig.
Ich kann dem Gedanken "Kernelement des Spiels" nicht widersprechen - aber wieso gleich ablehnen? Es gibt sicher Anwendung dafür, wenn man es gut in die Story reinpackt.
Die Idee dazu (Leibis aus DZ's UND Siedlungsplätze bauen) kamen mir bei der Planung/Erstellung neuer Karten...
@Zedeg:
Danke, erstaunlich (für mich) funktioniert das mit dem Key im Tooltip wunderbar, ich verstehe nicht, warum das bei mir vorher nicht ging ... (weswegen ich das so umständlich in den normalen Text geschrieben habe)
@mcb:
Okay - das könnte ich mir mal noch anschauen, danke
Edit: Ich finde zwar die Funktion für den Callback beim Fertigstellen eines Gebäudes, leider komme ich da irgendwie nicht erfolgreich rein
____________________
LG Play4FuN
Siedler DEdK Mapping + Scripting Tutorials
Dieser Beitrag wurde von Play4FuN am 15.11.2014 um 21:18 editiert.
mcb
|
#7 13.12.2014 15:36 Beiträge: 1472 |
Veränderst du irgendwo die GUI? Für meinen Test gerade musste ich Build_Outpost extra einblenden... Ansonsten funktioniert das bauen sehr gut (nachdem ich mein HQ-Bauen auf einen anderen Button gelegt habe ) Auch das Serf-Kaufen funktioniert. Kleiner Schönheitsfehler: Der Serf spawnt vor dem DZ, nicht darin.
Play4FuN
|
#8 13.12.2014 18:19 Beiträge: 704 |
Ja, das steht in meinem ersten Beitrag am Anfang mit drinn
-- Leibeigene im DZ kaufen XGUIEng.TransferMaterials("Buy_Serf",971) -- Außenposten --> Siedlungsplatz XGUIEng.ShowWidget(XGUIEng.GetWidgetID("Build_Outpost"),1) XGUIEng.SetWidgetPosition(XGUIEng.GetWidgetID("Build_Outpost"),323,40) for i=1,4 do XGUIEng.SetMaterialColor("Build_Outpost",(i-1),160,160,255,255) end
(InitPlayerColorMapping)
Der "Schönheitsfehler" ist mir bekannt. Mir war es aber lieber es so zu lösen, als umständlich noch extra mit anderen Models usw. zu arbeiten.
____________________
LG Play4FuN
Siedler DEdK Mapping + Scripting Tutorials
mcb
|
#9 13.12.2014 18:43 Beiträge: 1472 |
Der Effekt von XGUIEng.TransferMaterials("Buy_Serf",971) ist super: Es wird der mittlere Button (Webstuhl) ersetzt
(liegt wahrscheinlich an meiner modifizierten xml...)
Generell kannst du einfach den Namen direkt benutzen, funktioniert immer.
Zum Schönheitsfehler: Du brauchst nur den Serf im DZ spawnen lassen und seine TaskList passend Modifizieren. Funktioniert sogar ohne ScriptingValues. (Hab ich schon bei der Ausbildung von Leadern im HQ gemacht).
Play4FuN
|
#10 28.03.2015 12:07 Beiträge: 704 |
Neue Version vom Siedlunsplatz-Mod fertig
Ich habe mir Eure Vorschläge noch mal angeschaut und die alte Version von meinem "Siedlungsplatz-bau-Mod" überarbeitet.
Das ist neu:
- Das Bild im DZ wird richtig ersetzt
- Eine Anzeige im Leibeigenen-menu, wie viele DZ man zur Zeit bauen darf
- Es können nun auch mehrere gleichzeitig gebaut werden!
- Vorher konnte man Leibeigene auch aus dem DZ kaufen, während das DZ ausgebaut wurde (ups ); das ist nun behoben
- Es ist nun mit einem einzelnen Befehl möglich das Baulimit um 1 oder gleich mehrere Siedlungsplätze zu erhöhen (unendlich viele bauen zu dürfen ist, falls erwünscht, immer noch möglich)
Hier nun der neue Code:
function InitPlayerColorMapping() -- Leibeigene im DZ kaufen XGUIEng.TransferMaterials("Buy_Serf", "Research_TownGuard") -- Außenposten --> Siedlungsplatz XGUIEng.ShowWidget(XGUIEng.GetWidgetID("Build_Outpost"), 1) XGUIEng.SetWidgetPosition(XGUIEng.GetWidgetID("Build_Outpost"), 323, 40) for i=1,4 do XGUIEng.SetMaterialColor("Build_Outpost", (i-1), 160, 160, 255, 255) end end
Irgendwo im Skript (außer in einer anderen Funktion):
------------------------------------------------------------------------------------------------------------------------------------------------------- -- Code: Siedlungsplätze MOD Neu (Play4FuN) ----------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------- function VCMOD_Init(_limit, _textNormal, _textDisabled) VCMOD = {} VCMOD.VCBuild = 0 if _limit ~= nil then if type(_limit) == "number" then VCMOD.Limit = _limit elseif type(_limit) == "boolean" then if _limit == false then VCMOD.Limit = -1 -- kein Limit end end end if not _textNormal then -- normaler Tooltip VCMOD.TextNormal = "@color:180,180,180 Siedlungsplatz @cr @color:255,255,255 Errichtet einen Siedlungsplatz um Eure Siedlung zu erweitern und mehr Platz für neue Siedler zu schaffen." else VCMOD.TextNormal = Umlaute(_textNormal) end if not _textDisabled then -- Tooltip: keine weiteren Siedlungsplätze! VCMOD.TextDisabled = "@color:180,180,180 Siedlungsplatz @cr @color:255,255,255 Ihr könnt im Moment keinen weiteren Siedlungsplatz bauen." else VCMOD.TextDisabled = Umlaute(_textDisabled) end VCMOD_PlayerBuildVillageCenter() -- Gebäudebau Trigger.RequestTrigger(Events.LOGIC_EVENT_ENTITY_CREATED, "", "VCMOD_ON_ENTITY_CREATED", 1) VCMOD_BuySerfFromVillageCenter() -- Leibeigene aus Dorfzentren end function VCMOD_PlayerBuildVillageCenter() -- GUI Action GUIAction_PlaceBuilding_Orig = GUIAction_PlaceBuilding GUIAction_PlaceBuilding = function( _a) if _a == UpgradeCategories.Outpost then if (VCMOD.VCBuild < VCMOD.Limit) or (VCMOD.Limit == -1) then GUIAction_PlaceBuilding_Orig(_a) end else -- anderes Gebäude: wird normal platziert GUIAction_PlaceBuilding_Orig(_a) end end -- Tooltips GUITooltip_ConstructBuilding_Orig = GUITooltip_ConstructBuilding GUITooltip_ConstructBuilding = function(_e1,_e2,_e3,_e4,_e5) GUITooltip_ConstructBuilding_Orig(_e1,_e2,_e3,_e4,_e5) if string.find(_e2, "MenuSerf/outpost_normal") ~= nil then local _limitText if VCMOD.Limit == -1 then _limitText = col.hblau.." Limit: "..col.w.."(unbegrenzt)" else _limitText = col.hblau.." Limit: "..col.w..VCMOD.Limit end if (VCMOD.VCBuild < VCMOD.Limit) or (VCMOD.Limit == -1) then XGUIEng.SetText(gvGUI_WidgetID.TooltipBottomText, VCMOD.TextNormal.._limitText) else XGUIEng.SetText(gvGUI_WidgetID.TooltipBottomText, VCMOD.TextDisabled.._limitText) end end end function Score.OnBuildingConstructionComplete(_BuildingID, _PlayerID) if _PlayerID ~= 0 then -- Zusatz: Punkte werden nur verteilt, wenn die SpielerID gültig ist - nötig um Absturz/Fehler zu vermeiden! Score.Player[_PlayerID]["buildings"] = Score.Player[_PlayerID]["buildings"] + Score.ConstructionPoints Score.Player[_PlayerID]["all"] = Score.Player[_PlayerID]["all"] + Score.ConstructionPoints end end end VCMOD_ON_ENTITY_CREATED = function() local _eId = Event.GetEntityID() local _pId = Logic.EntityGetPlayer(_eId) local _eType = Logic.GetEntityTypeName(Logic.GetEntityType(_eId)) if _eType == "PB_Outpost1" then -- Außenposten Logic.SetModelAndAnimSet(_eId, Models.XD_VillageCenter) VCMOD.VCBuild = VCMOD.VCBuild + 1 -- Check if the building is completed Trigger.RequestTrigger( Events.LOGIC_EVENT_EVERY_SECOND, "VCMOD_IsBuildingFinished", -- condition function "VCMOD_OnBuildingFinished", -- action function 1, -- is active {_eId}, -- table for condition function {_eId} -- table for action function ) -- Check if the building gets destroyed Trigger.RequestTrigger( Events.LOGIC_EVENT_EVERY_SECOND, "VCMOD_IsBuildingDestroyed", -- condition function "VCMOD_OnBuildingDestroyed", -- action function 1, -- is active {_eId}, -- table for condition function {_eId} -- table for action function ) end end function VCMOD_IsBuildingFinished(_eId) return Logic.IsConstructionComplete(_eId) == 1 end function VCMOD_OnBuildingFinished(_eId) ReplaceEntity(_eId, Entities.XD_VillageCenter) VCMOD.VCBuild = VCMOD.VCBuild + 1 return true end function VCMOD_IsBuildingDestroyed(_eId) return IsDestroyed(_eId) end function VCMOD_OnBuildingDestroyed(_eId) VCMOD.VCBuild = VCMOD.VCBuild - 1 return true end function VCMOD_SetLimit(_limit) -- set a new limit if _limit ~= nil then if type(_limit) == "number" then VCMOD.Limit = _limit elseif type(_limit) == "boolean" then if _limit == false then VCMOD.Limit = -1 -- kein Limit end end end return VCMOD.Limit end function VCMOD_IncreaseLimit(_amount) -- increase limit by 1 or _amount if not _amount then _amount = 1 end if VCMOD.Limit == -1 then return else VCMOD_SetLimit(VCMOD.Limit + _amount) end return VCMOD.Limit end function VCMOD_BuySerfFromVillageCenter() SerfHack = {_used = false, _waittime = 2} SerfHack_OverwriteTechnology() SerfHack_OverwriteTooltip() end function SerfHack_OverwriteTechnology() GUIAction_ReserachTechnology_Orig = GUIAction_ReserachTechnology GUIAction_ReserachTechnology = function(tech) if tech == Technologies.T_TownGuard then local posDZ = GetPosition(GUI.GetSelectedEntity()) local places = (Logic.GetPlayerAttractionLimit(1) - Logic.GetPlayerAttractionUsage(1)) local uptimeleft = (Logic.GetRemainingUpgradeTimeForBuilding(GUI.GetSelectedEntity())) -- verbleibende Zeit für Ausbau local uptimetotal = (Logic.GetTotalUpgradeTimeForBuilding(GUI.GetSelectedEntity())) -- gesamte Zeit für Ausbau if GetGold(1) > 49 then if places > 0 then if uptimetotal == uptimeleft then -- um sicher zu gehen, dass das DZ nicht gerade ausgebaut wird SetEntityName(Logic.CreateEntity(Entities.XD_ScriptEntity,(posDZ.X)-100,(posDZ.Y)-900,0,8),"TEMP_POS_DZ_MOVE") Move(Logic.CreateEntity(Entities.PU_Serf,(posDZ.X)-200,(posDZ.Y)-650,0,1),"TEMP_POS_DZ_MOVE") DestroyEntity("TEMP_POS_DZ_MOVE") AddGold(1, -50) -- kein else nötig, es passiert nichts end else SerfHack_FeedbackNotEnoughPlaces() -- keine freien Plätze end else SerfHack_FeedbackNotEnoughGold() -- nicht genug Gold end else GUIAction_ReserachTechnology_Orig(tech) end end end function SerfHack_FeedbackNotEnoughPlaces() if SerfHack._used == false then StartCountdown(SerfHack._waittime, SerfHack_ResetWaitTime, false) Message("Ihr habt keinen Platz mehr in Eurer Siedlung!") Sound.PlayGUISound(Sounds.VoicesMentor_INFO_VillageCenterEmpty_rnd_01, 100) SerfHack._used = true end end function SerfHack_FeedbackNotEnoughGold() if SerfHack._used == false then StartCountdown(SerfHack._waittime, SerfHack_ResetWaitTime, false) Message("Ihr habt nicht genug Taler!") Sound.PlayGUISound(Sounds.VoicesMentor_INFO_NotEnoughGold_rnd_01, 100) SerfHack._used = true end end function SerfHack_ResetWaitTime() SerfHack._used = false end function SerfHack_OverwriteTooltip() GUITooltip_ResearchTechnologies_orig = GUITooltip_ResearchTechnologies function GUITooltip_ResearchTechnologies(_tech,_widget,_keybind) if (_tech == Technologies.T_TownGuard) then XGUIEng.SetText(gvGUI_WidgetID.TooltipBottomCosts,"Taler: 50") XGUIEng.SetText("TooltipBottomShortCut", "Taste: [Q]") XGUIEng.SetText(gvGUI_WidgetID.TooltipBottomText,"@color:180,180,180 Kauft einen Leibeigenen @cr @color:255,255,255 Ein Leibeigener sammelt Ressourcen, baut und repariert Häuser und kann die Gegend erkunden. Er braucht kein Haus und keinen Bauernhof.") else GUITooltip_ResearchTechnologies_orig(_tech,_widget,_keybind) end end end
Der erste und einmalige Aufruf lautet so:
-- Limit: 2; Texte: (Standard) VCMOD_Init(2, nil, nil)
oder so:
-- Limit: unendlich; eigene Texte VCMOD_Init(false, "Baut ein DZ...", "Nix da ... kein DZ ...")
Im Nachhinein kann das Limit wie folgt verändert werden:
VCMOD_IncreaseLimit(2) -- erhöht Limit um 2
oder so
VCMOD_IncreaseLimit() -- erhöht Limit um 1
bzw.
VCMOD_SetLimit(5) -- Spieler darf nun 5 Siedlungsplätze bauen
Viel Spaß beim Ausprobieren und lasst mich wissen, wenn etwas nicht funktioniert, ich etwas vergessen habe oder Ihr Fragen/Anregungen habt.
____________________
LG Play4FuN
Siedler DEdK Mapping + Scripting Tutorials
castleplayer
|
#11 08.04.2015 15:15 Beiträge: 243 |
So wie ich das jetzt verstehe bewegt man dann einen Außenposten auf der dorthin, wo man einen Siedlungsplatz bauen möchte?
____________________
Wenn die KI immer frontal angreift, wofür steht dann Das I in Künstliche Intelligenz?
Das neueste vom Nebelvolk!
Play4FuN
|
#12 10.04.2015 14:53 Beiträge: 704 |
Ja, man sieht zunächst einen Außenposten, der wird aber nach dem Platzieren zum Siedlungsplatz, der dann ganz normal besetzt werden kann
____________________
LG Play4FuN
Siedler DEdK Mapping + Scripting Tutorials
castleplayer
|
#13 12.04.2015 22:56 Beiträge: 243 |
Jetzt nur ne Idee
Es gibt ja in UpgradeCategories auch
UpgradeCategories.NeutralVillageCenter
Das setzt ja leider sofort das Dorfzentrum ohne irgendwelche Bauanimationen
(gut für meine NV Zwecke reichts ; übringens danke für die Tolle Idee Siedlungsplätze selbst bauen/platzieren zu können)
Man könnte doch...
Den Spieler einen Siedlungsplatz auf der Map platzieren lassen.
Sobald er platziert ist ihn zerstören und durch einen Außenposten mit Model-Set Siedlungsplatz und einem Baufortschritt von 0 (hier weiß ich nicht ob das machbar ist) ersetzen.
____________________
Wenn die KI immer frontal angreift, wofür steht dann Das I in Künstliche Intelligenz?
Das neueste vom Nebelvolk!
Seiten: 1