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

SiteEngine v1.5.0 by nevermind, ©2005-2007
Design by SpiderFive (www.siedler-games.de) - English translation by juja

Impressum