Inhaltsverzeichnis

Comfort: Mauern selbst bauen

Beschreibung

Der Code ermöglicht dass Leibeigene ab sofort Mauern und Tore bauen.
Dazu sind Zierobjekte nun zum Mauerbau freigegeben.

Anwendung

Die Abhängigkeiten müssen im Skript irgendwo auftauchen! Danach einfach in der FMA „SetupWalls()“ aufrufen

Code

function SetupWalls()		
	local _enter=string.char(13)
	table.insert(GUITooltip_ConstructBuilding_BeforeOrig,
		function(...)			
			if arg[1] == 31 then
				XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomText, "@color:180,180,180 Mauer @cr @color:255,255,255 Errichtet eine Mauer für eure Siedlung. Bei der Fertigstellung kostet diese Extraressourcen. Eure Siedler fühlen sich sicherer (Motivationsschub)." )
				XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomCosts, "Taler: 100 @cr Lehm: 100" )
				return false
			elseif arg[1] == 28 then
				XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomText, "@color:180,180,180 Tor @cr @color:255,255,255 Errichtet ein Tor für eure Schutzmauern. Eure Siedler fühlen sich sicherer (Motivationsschub)." )
				XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomCosts, "Taler: 200 @cr Stein: 100" )
				return false
			elseif arg[1] == 66 then
				XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomText, "@color:180,180,180 Abschlussmauer @cr @color:255,255,255 Errichtet eine Abschlussmauer um Mauerteile zu verbinden oder eine Mauer über die Baugrenzen hinaus zu erweitern. Eure Siedler fühlen sich sicherer (Motivationsschub)." )
				XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomCosts, "Taler: 300 @cr Stein: 100" )
				return false
			elseif arg[1] == 30 then
				XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomText, "@color:180,180,180 Mauerturm @cr @color:255,255,255 Errichtet einen Ballistaturm der direkt in der nahesten Mauer platziert wird. Eure Siedler fühlen sich sicherer (Motivationsschub)." )
				XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomCosts, "Taler: 400 @cr Stein: 200" )
				return false
			end
		end
	)
 
    -- Model ersetzen wenn Mauer errichtet wird
	WallsOnEntityCreated = function()
		local _eId = Event.GetEntityID()
		local _pId = GetPlayer(_eId)
		local _eType = Logic.GetEntityType(_eId)
		if _eType == Entities.PB_Beautification04  then
			Logic.SetModelAndAnimSet(_eId,Models.XD_WallStraight)
		elseif _eType == Entities.PB_Beautification01  then
			Logic.SetModelAndAnimSet(_eId,Models.XD_WallStraightGate)
		elseif _eType == Entities.PB_Beautification05  then
			Logic.SetModelAndAnimSet(_eId,Models.XD_DarkWallDistorted)
		elseif _eType == Entities.PB_Beautification03  then
			Logic.SetModelAndAnimSet(_eId,Models.PB_DarkTower2)
		end
	end
	Trigger.RequestTrigger( Events.LOGIC_EVENT_ENTITY_CREATED, "", "WallsOnEntityCreated", 1)
	SelfCreatedWalls = {}
	for i = 0,8 do
		SelfCreatedWalls[i] = {}
	end
	SelfCreatedWalls_PfostenSellTributeIDs = {}
	SetupWallsMauerplatzieren = function(_eId)		
		local _pId = GetPlayer(_eId)
		local _PfostenID = 0
		local _PfostenID2 = 0
		local _pos = GetPosition(_eId)
		local _eType = Logic.GetEntityType(_eId)
		if type(SelfCreatedWalls[_pId][_eId]) ~= "table" then	
 
			local _mauer = 0
			local _mauer2 = 0
			local _mauerecke1 = 0
			local _mauerecke2 = 0
			local _istMauer = true
			local _entfernung = 1200
 
			if _eType ~= Entities.PB_Beautification05 then
				for u = 1,3 do
					if u == 1 then _mauern ={Logic.GetPlayerEntitiesInArea(_pId,Entities.XD_WallStraight, _pos.X, _pos.Y, 1200,16)}
					elseif u == 2 then _mauern ={Logic.GetPlayerEntitiesInArea(_pId,Entities.XD_WallStraightGate, _pos.X, _pos.Y, 1200,16)}
					elseif u == 3 then  _mauern ={Logic.GetPlayerEntitiesInArea(_pId,Entities.XD_WallStraightGate_Closed, _pos.X, _pos.Y, 1200,16)}
					end
					for i = 2, table.getn(_mauern) do
						local _distance = GetDistance(_mauern[i],_eId)
						if _distance < _entfernung and _distance > 0 and Logic.IsConstructionComplete(_mauern[i]) == 1  then
							_mauer = _mauern[i]
							_entfernung = _distance
						end
					end				
				end
			else
				for u = 1,3 do
					if u == 1 then _mauern ={Logic.GetPlayerEntitiesInArea(_pId,Entities.XD_WallStraight, _pos.X, _pos.Y, 1200,16)}
					elseif u == 2 then _mauern ={Logic.GetPlayerEntitiesInArea(_pId,Entities.XD_WallStraightGate, _pos.X, _pos.Y, 1200,16)}
					elseif u == 3 then  _mauern ={Logic.GetPlayerEntitiesInArea(_pId,Entities.XD_WallStraightGate_Closed, _pos.X, _pos.Y, 1200,16)}
					end
					for i = 2, table.getn(_mauern) do
						local _distance = GetDistance(_mauern[i],_eId)			
						if _distance < _entfernung and _distance > 0 and Logic.IsConstructionComplete(_mauern[i]) == 1  then	
							local _orientation = Logic.GetEntityOrientation(_mauern[i])
							if _orientation < 90 then
								_orientation = 270 + _orientation
							else
								_orientation = _orientation - 90
							end	
							local _posMauer = GetPosition(_mauern[i])
							local _ecke1
							local _ecke2
							if _istMauer then
								_ecke1 = {X=_posMauer.X+math.cos(_orientation/360*math.pi*2) * 200,Y=_posMauer.Y+math.sin(_orientation/360*math.pi*2) * 200}
								_ecke2 = {X=_posMauer.X-math.cos(_orientation/360*math.pi*2) * 200,Y=_posMauer.Y-math.sin(_orientation/360*math.pi*2) * 200}
							else
								_ecke1 = {X=_posMauer.X+math.cos(_orientation/360*math.pi*2) * 300,Y=_posMauer.Y+math.sin(_orientation/360*math.pi*2) * 300}
								_ecke2 = {X=_posMauer.X-math.cos(_orientation/360*math.pi*2) * 300,Y=_posMauer.Y-math.sin(_orientation/360*math.pi*2) * 300}				
							end
							local _pfosten ={Logic.GetPlayerEntitiesInArea(_pId,Entities.XD_WallCorner, _ecke1.X, _ecke1.Y, 100,16)}
							if _pfosten[1] == 0 then
								_mauer = _mauern[i]
								_entfernung = _distance
								_mauerecke1 = _ecke1
							else
								_pfosten ={Logic.GetPlayerEntitiesInArea(_pId,Entities.XD_WallCorner, _ecke2.X, _ecke2.Y, 100,16)}
								if _pfosten[1] == 0 then
									_mauer = _mauern[i]
									_entfernung = _distance	
									_mauerecke1 = _ecke2							
								end
							end
						end
					end				
				end
				if _mauer > 0 then
					_entfernung = 1200
					for u = 1,3 do
						if u == 1 then _mauern ={Logic.GetPlayerEntitiesInArea(_pId,Entities.XD_WallStraight, _pos.X, _pos.Y, 1200,16)}
						elseif u == 2 then _mauern ={Logic.GetPlayerEntitiesInArea(_pId,Entities.XD_WallStraightGate, _pos.X, _pos.Y, 1200,16)}
						elseif u == 3 then  _mauern ={Logic.GetPlayerEntitiesInArea(_pId,Entities.XD_WallStraightGate_Closed, _pos.X, _pos.Y, 1200,16)}
						end
						for i = 2, table.getn(_mauern) do
							local _distance = GetDistance(_mauern[i],_eId)		
							if _distance < _entfernung and _distance > 0 and Logic.IsConstructionComplete(_mauern[i]) == 1 then	
								local _orientation = Logic.GetEntityOrientation(_mauern[i])
								if _orientation < 90 then
									_orientation = 270 + _orientation
								else
									_orientation = _orientation - 90
								end	
								local _posMauer = GetPosition(_mauern[i])
								local _ecke1
								local _ecke2
								if _istMauer then
									_ecke1 = {X=_posMauer.X+math.cos(_orientation/360*math.pi*2) * 200,Y=_posMauer.Y+math.sin(_orientation/360*math.pi*2) * 200}
									_ecke2 = {X=_posMauer.X-math.cos(_orientation/360*math.pi*2) * 200,Y=_posMauer.Y-math.sin(_orientation/360*math.pi*2) * 200}
								else
									_ecke1 = {X=_posMauer.X+math.cos(_orientation/360*math.pi*2) * 300,Y=_posMauer.Y+math.sin(_orientation/360*math.pi*2) * 300}
									_ecke2 = {X=_posMauer.X-math.cos(_orientation/360*math.pi*2) * 300,Y=_posMauer.Y-math.sin(_orientation/360*math.pi*2) * 300}				
								end
								local _pfosten ={Logic.GetPlayerEntitiesInArea(_pId,Entities.XD_WallCorner, _ecke1.X, _ecke1.Y, 100,16)}
								if _pfosten[1] == 0 and not(_mauerecke1.X == _ecke1.X and _mauerecke1.Y == _ecke1.Y) then
									if GetDistance(_ecke1,_mauerecke1) <= 615 then
										_mauer2 = _mauern[i]
										_entfernung = _distance
										_mauerecke2 = _ecke1
									end
								else
									_pfosten ={Logic.GetPlayerEntitiesInArea(_pId,Entities.XD_WallCorner, _ecke2.X, _ecke2.Y, 100,16)}
									if _pfosten[1] == 0 and not(_mauerecke1.X == _ecke2.X and _mauerecke1.Y == _ecke2.Y)  then
										if GetDistance(_ecke2,_mauerecke1) <= 615 then
											_mauer2 = _mauern[i]
											_entfernung = _distance
											_mauerecke2 = _ecke2
										end
									end
								end
							end
						end				
					end				
				end
			end
 
			if _mauer > 0 then
				if _mauerecke1 == 0 then
					local _ecke
					_orientation = Logic.GetEntityOrientation(_mauer)
					if _orientation < 90 then
						_orientation = 270 + _orientation
					else
						_orientation = _orientation - 90
					end		
					local _posMauer = GetPosition(_mauer)
					local _ecke1
					local _ecke2
					if _istMauer then
						_ecke1 = {X=_posMauer.X+math.cos(_orientation/360*math.pi*2) * 200,Y=_posMauer.Y+math.sin(_orientation/360*math.pi*2) * 200}
						_ecke2 = {X=_posMauer.X-math.cos(_orientation/360*math.pi*2) * 200,Y=_posMauer.Y-math.sin(_orientation/360*math.pi*2) * 200}
					else
						_ecke1 = {X=_posMauer.X+math.cos(_orientation/360*math.pi*2) * 300,Y=_posMauer.Y+math.sin(_orientation/360*math.pi*2) * 300}
						_ecke2 = {X=_posMauer.X-math.cos(_orientation/360*math.pi*2) * 300,Y=_posMauer.Y-math.sin(_orientation/360*math.pi*2) * 300}				
					end
 
					if GetDistance(_pos,_ecke1) > GetDistance(_pos,_ecke2) then
						_ecke = _ecke2
					else
						_ecke = _ecke1
					end
					_orientation = Winkel(_ecke,_eId)
					local _newPos
					if _eType == Entities.PB_Beautification04 then
						_newPos = {X=_ecke.X+math.cos((_orientation)/360*math.pi*2) * 200,Y=_ecke.Y+math.sin((_orientation)/360*math.pi*2) * 200}
					else
						_newPos = {X=_ecke.X+math.cos((_orientation)/360*math.pi*2) * 300,Y=_ecke.Y+math.sin((_orientation)/360*math.pi*2) * 300}
					end
					if _orientation < 90 then
						_orientation = 270 + _orientation
					else
						_orientation = _orientation - 90
					end				
					DestroyEntity(_eId)
					if _eType == Entities.PB_Beautification04 then
						_eId = Logic.CreateEntity( Entities.XD_WallStraight, _newPos.X, _newPos.Y, _orientation, _pId )
					else
						_eId = Logic.CreateEntity( Entities.XD_WallStraightGate, _newPos.X, _newPos.Y, _orientation, _pId )
					end
					_PfostenID = Logic.CreateEntity( Entities.XD_WallCorner, _ecke.X, _ecke.Y, 0, _pId )
				else
					if _mauerecke2 == 0 then
						_orientation = Winkel(_mauer,_mauerecke1)
						local _newPos = {X=_mauerecke1.X+math.cos((_orientation)/360*math.pi*2) * 285,Y=_mauerecke1.Y+math.sin((_orientation)/360*math.pi*2) * 285}
						_ecke1 = {X=_newPos.X+math.cos(_orientation/360*math.pi*2) * 290,Y=_newPos.Y+math.sin(_orientation/360*math.pi*2) * 290}
						_ecke2 = {X=_newPos.X-math.cos(_orientation/360*math.pi*2) * 290,Y=_newPos.Y-math.sin(_orientation/360*math.pi*2) * 290}						
						if _orientation < 135 then
							_orientation = 270 + _orientation - 45
						else
							_orientation = _orientation - 90 - 45
						end				
						DestroyEntity(_eId)
						_eId = Logic.CreateEntity( Entities.XD_WallDistorted, _newPos.X, _newPos.Y, _orientation, _pId )
 
						_PfostenID = Logic.CreateEntity( Entities.XD_WallCorner, _ecke1.X, _ecke1.Y, 0, _pId )
						_PfostenID2 = Logic.CreateEntity( Entities.XD_WallCorner, _ecke2.X, _ecke2.Y, 0, _pId )
					else
						_orientation = Winkel(_mauerecke1,_mauerecke2)
						local _newPos = {X=_mauerecke1.X+math.cos((_orientation)/360*math.pi*2) * 285,Y=_mauerecke1.Y+math.sin((_orientation)/360*math.pi*2) * 285}
						_ecke1 = {X=_newPos.X+math.cos(_orientation/360*math.pi*2) * 290,Y=_newPos.Y+math.sin(_orientation/360*math.pi*2) * 290}
						_ecke2 = {X=_newPos.X-math.cos(_orientation/360*math.pi*2) * 290,Y=_newPos.Y-math.sin(_orientation/360*math.pi*2) * 290}						
						if _orientation < 135 then
							_orientation = 270 + _orientation - 45
						else
							_orientation = _orientation - 90 - 45
						end				
						DestroyEntity(_eId)
						_eId = Logic.CreateEntity( Entities.XD_WallDistorted, _newPos.X, _newPos.Y, _orientation, _pId )
						_PfostenID = Logic.CreateEntity( Entities.XD_WallCorner, _ecke1.X, _ecke1.Y, 0, _pId )
						_PfostenID2 = Logic.CreateEntity( Entities.XD_WallCorner, _ecke2.X, _ecke2.Y, 0, _pId )
					end
				end
			else
				DestroyEntity(_eId)
				if _eType == Entities.PB_Beautification04 then
					_eId = Logic.CreateEntity( Entities.XD_WallStraight, _pos.X, _pos.Y, 0, _pId )
				elseif  _eType == Entities.PB_Beautification01 then
					_eId = Logic.CreateEntity( Entities.XD_WallStraightGate, _pos.X, _pos.Y, 0, _pId )
				elseif  _eType == Entities.PB_Beautification05 then
					_eId = Logic.CreateEntity( Entities.XD_WallDistorted, _pos.X, _pos.Y, 0, _pId )
				end
			end
			SelfCreatedWalls[_pId][_eId] = {}
			SelfCreatedWalls[_pId][_eId].ID = _eId
			function GetSellTributCallback(_pId,_eId)
				local myfunc = function()
					local _pos = GetPosition(_eId)
					DestroyEntity(SelfCreatedWalls[_pId][_eId].ID)
					Tools.GiveResouces(_pId, 100, nil, nil, nil, nil, nil)
					Logic.CreateEffect( GGL_Effects.FXBuildingSmoke, _pos.X, _pos.Y, _pId );
				end
				return myfunc
			end
			function GetSellTributCallbackPfosten(_pId,_eId)
				local myfunc = function()
					local _pos = GetPosition(_eId)
					DestroyEntity(_eId)
					Logic.CreateEffect( GGL_Effects.FXBuildingSmoke, _pos.X, _pos.Y, _pId );
				end
				return myfunc
			end
			function GetCloseTributCallback(_pId,_eId)
				local myfunc = function()
					local _eType = Logic.GetEntityType(_eId)
					local _eIdNew =_eId
					local _oldHealth
					if _eType == Entities.XD_WallStraightGate then
						_oldHealth = Logic.GetEntityHealth(_eId)
						_eIdNew = ReplaceEntity (_eId, Entities.XD_WallStraightGate_Closed )
						Logic.HurtEntity(_eIdNew,Logic.GetEntityMaxHealth(_eIdNew)-_oldHealth)
					elseif _eType == Entities.XD_WallStraightGate_Closed then
						_oldHealth = Logic.GetEntityHealth(_eId)
						_eIdNew = ReplaceEntity (_eId, Entities.XD_WallStraightGate )
						Logic.HurtEntity(_eIdNew,Logic.GetEntityMaxHealth(_eIdNew)-_oldHealth)
					end
					if _eIdNew ~= _eId then
						SelfCreatedWalls[_pId][_eIdNew] = SelfCreatedWalls[_pId][_eId]
						SelfCreatedWalls[_pId][_eIdNew].ID = _eIdNew
						MakeInvulnerable(_eIdNew)
						SelfCreatedWalls[_pId][_eIdNew].SellTributID = AddTribute( CreateATribute(8, "", { Gold = 0}, GetSellTributCallback(_pId,_eIdNew) ) )
						SelfCreatedWalls[_pId][_eIdNew].CloseTributID = AddTribute( CreateATribute(8, "", { Gold = 0}, GetCloseTributCallback(_pId,_eIdNew) ) )
					end
				end
				return myfunc
			end
			SelfCreatedWalls[_pId][_eId].CloseTributID = AddTribute( CreateATribute(8, "", { Gold = 0}, GetCloseTributCallback(_pId,_eId) ) )	
			SelfCreatedWalls[_pId][_eId].SellTributID = AddTribute( CreateATribute(8, "", { Gold = 0}, GetSellTributCallback(_pId,_eId) ) )	
			SelfCreatedWalls[_pId][_eId].Pfosten = _PfostenID
			SelfCreatedWalls[_pId][_eId].Pfosten2 = _PfostenID2
			SelfCreatedWalls_PfostenSellTributeIDs[_PfostenID]  = AddTribute( CreateATribute(8, "", { Gold = 0}, GetSellTributCallbackPfosten(_pId,_PfostenID) ) )
			SelfCreatedWalls_PfostenSellTributeIDs[_PfostenID2]  = AddTribute( CreateATribute(8, "", { Gold = 0}, GetSellTributCallbackPfosten(_pId,_PfostenID2) ) )			
			MakeInvulnerable(_eId)
			MakeInvulnerable(_PfostenID)
			MakeInvulnerable(_PfostenID2)
		end
		return true
	end	
	SetupWallsTurmplatzieren = function(_eId)		
		local _pId = GetPlayer(_eId)
		local _pos = GetPosition(_eId)
		local _eType = Logic.GetEntityType(_eId)			
		local _mauer = 0
		local _entfernung = 1200
		for u = 1,2 do
			if u == 1 then _mauern ={Logic.GetPlayerEntitiesInArea(_pId,Entities.XD_WallStraight, _pos.X, _pos.Y, 1200,16)}
			elseif u == 2 then  _mauern ={Logic.GetPlayerEntitiesInArea(_pId,Entities.XD_WallDistorted, _pos.X, _pos.Y, 1200,16)}
			end
			for i = 2, table.getn(_mauern) do
				local _distance = GetDistance(_mauern[i],_eId)
				if _distance < _entfernung and _distance > 0 and Logic.IsConstructionComplete(_mauern[i]) == 1  then
					local _mauerpos = GetPosition(_mauern[i])
					local _turm ={Logic.GetPlayerEntitiesInArea(_pId,Entities.PB_DarkTower2, _mauerpos.X, _mauerpos.Y, 100,16)}
					if _turm[1] <= 0 then
						local _turm ={Logic.GetPlayerEntitiesInArea(_pId,Entities.PB_DarkTower3, _mauerpos.X, _mauerpos.Y, 100,16)}
						if _turm[1] <= 0 then
							_mauer = _mauern[i]
							_entfernung = _distance						
						end
					end
				end
			end				
		end
		if _mauer ~= 0 then
			local _posMauer = GetPosition(_mauer)
			DestroyEntity(_eId)
			Logic.CreateEntity( Entities.PB_DarkTower2, _posMauer.X+1, _posMauer.Y+1, 0, _pId )
		else
			DestroyEntity(_eId)
			Logic.CreateEntity( Entities.PB_DarkTower2, _pos.X+1, _pos.Y+1, 0, _pId )			
		end
		return true
	end
	SetupWallsWallDestroyed = function()
		local _eId = Event.GetEntityID()
		local _pId = GetPlayer(_eId)
		if type(SelfCreatedWalls[_pId][_eId]) == "table" then
			MakeVulnerable(SelfCreatedWalls[_pId][_eId].Pfosten)
			DestroyEntity(SelfCreatedWalls[_pId][_eId].Pfosten)
			MakeVulnerable(SelfCreatedWalls[_pId][_eId].Pfosten2)
			DestroyEntity(SelfCreatedWalls[_pId][_eId].Pfosten2)
			Logic.RemoveTribute( 8, SelfCreatedWalls[_pId][_eId].SellTributID)
			Logic.RemoveTribute( 8, SelfCreatedWalls_PfostenSellTributeIDs[SelfCreatedWalls[_pId][_eId].Pfosten])
			Logic.RemoveTribute( 8, SelfCreatedWalls_PfostenSellTributeIDs[SelfCreatedWalls[_pId][_eId].Pfosten2])
			Logic.RemoveTribute( 8, SelfCreatedWalls[_pId][_eId].CloseTributID)			
			table.remove(SelfCreatedWalls[_pId], _eId)
		end
	end
	table.insert(GameCallback_OnBuildingConstructionComplete_AfterOrig,
		function(_eId,_pId)
			local _eType = Logic.GetEntityType(_eId)
			if _eType == Entities.PB_Beautification04 then
				StartSimpleJob(SetupWallsMauerplatzieren,_eId)
			elseif _eType == Entities.PB_Beautification01  then
				StartSimpleJob(SetupWallsMauerplatzieren,_eId)
			elseif _eType == Entities.PB_Beautification05  then
				StartSimpleJob(SetupWallsMauerplatzieren,_eId)
			elseif _eType == Entities.PB_Beautification03  then -- turm
				StartSimpleJob(SetupWallsTurmplatzieren,_eId)
			end
		end
	)
	table.insert(GameCallback_GUI_SelectionChanged_AfterOrig,
		function(...)
			local _eType = Logic.GetEntityType(GUI.GetSelectedEntity())
			if _eType == Entities.PB_DarkTower2 then
				XGUIEng.ShowWidget( 1141, 1);
				XGUIEng.ShowWidget( 1143, 0);
				XGUIEng.ShowWidget( 1144, 1);
			end
		end
	)
 
	table.insert(GUI.SellBuilding_AfterOrig,
		function()
			if type(SelfCreatedWalls[gv_guipId][GUI.GetSelectedEntity()]) == "table" then
				GUI.PayTribute( 8, SelfCreatedWalls[gv_guipId][GUI.GetSelectedEntity()].SellTributID)
			elseif SelfCreatedWalls_PfostenSellTributeIDs[GUI.GetSelectedEntity()] ~= nil then
				Message("jo")
				GUI.PayTribute( 8, SelfCreatedWalls_PfostenSellTributeIDs[GUI.GetSelectedEntity()])
			end
			table.remove(SelfCreatedWalls[gv_guipId], GUI.GetSelectedEntity())
		end
	)
 
	table.insert(GUIAction_DoNotDestroyBuilding_BeforeOrig,
		function()
			if type(SelfCreatedWalls[gv_guipId][GUI.GetSelectedEntity()]) == "table" then				
				GUI.PayTribute( 8, SelfCreatedWalls[gv_guipId][GUI.GetSelectedEntity()].CloseTributID)
			end
		end
	)
	Trigger.RequestTrigger( Events.LOGIC_EVENT_ENTITY_DESTROYED, "", "SetupWallsWallDestroyed", 1)
    XGUIEng.TransferMaterials(996 , 799 )  --Mauer
	XGUIEng.TransferMaterials(837 , 796 )   --Tor
	XGUIEng.TransferMaterials(1140 , 800 )   --Abschlussmauer
	XGUIEng.TransferMaterials(827 , 798 )   --MauerTurm
	-- ########################
	-- ### Comfort Mauer Rüstung by Noigi
	WALL_ARMOR = 15;
	WALL_ARMOR_TECHBONUS = 5;
	GetWallArmor = function(_pID)
		local armor = WALL_ARMOR;
		if Logic.IsTechnologyResearched( _pID, Technologies.T_Masonry ) == 1 then
			armor = armor+WALL_ARMOR_TECHBONUS;
		end
		return armor;
	end
 
	Walls_ActionOnEntityHurt = function()
		local tarID = Event.GetEntityID2();
		local tarPlayer = GetPlayer( tarID )
		local tarType = Logic.GetEntityType(tarID);		
		if type(SelfCreatedWalls[tarPlayer][tarID]) == "table" then	
			local attID = Event.GetEntityID1();
			local attType = Logic.GetEntityType(attID);
			local ap = Logic.GetEntityDamage(attID);
			if ap > 22 then ap = 22 end
			if attType >= 207 and attType <= 214 then
				ap = ap*1.5
				if ap > 25 then ap = 25 end
			end
			local pID = GetPlayer(tarID);
			local def = GetWallArmor(pID);
			local dmg = math.max( ap-def, 1 );			
			local hp = Logic.GetEntityHealth(tarID);
			if hp > dmg then
				MakeVulnerable(tarID);
				Logic.HurtEntity(tarID,dmg);
				MakeInvulnerable(tarID);
			else
				MakeVulnerable(tarID);
				SetHealth(tarID,0);
			end
		end
	end
	Trigger.RequestTrigger( Events.LOGIC_EVENT_ENTITY_HURT_ENTITY, "", "Walls_ActionOnEntityHurt", 1);
 
	-- ########################
	-- ### Comfort Mauer Rüstung GUI
 
	table.insert(GUIUpdate_Armor_BeforeOrig,
		function()
			local sel = GUI.GetSelectedEntity()
			local selType = Logic.GetEntityType(sel)
			if (selType == Entities.XD_WallStraightGate_Closed) or (selType == Entities.XD_WallStraightGate) or (selType == Entities.XD_WallStraight)  or (selType == Entities.XD_WallDistorted) then
				XGUIEng.SetText( XGUIEng.GetCurrentWidgetID(), "@ra "..GetWallArmor(GUI.GetPlayerID()) );
				return false
			end
		end
	)	
end

Abhängigkeiten

Folgende Codes müssen auch im Skript sein:

Chromix Tools

Sagt schon alles: Autor Chromix

	CxTools = CxTools or {}; 
 
	function CxTools:Init()
		CxTools:InitUnpackFix();
		CxTools:InitTriggers();
	end
 
	--#########################################################################
	--###
	--###	 Utility Functions
	--###
 
	function CxTools.Panic(_text)
		Message("-----------------------------------------");
		Message("Error: " .. tostring(_text));
		Message("-----------------------------------------");
		--assert(false,tostring(_text))
		local _table = { text = _text };
		StartSimpleJob(CxTools.GlobalTriggerDebug, _table);
	end
	function CxTools.PanicOrig(_text)
		Message("Hallo Welt")
		assert(false,tostring(_text))
	end	
	--#########################################################################
	--###
	--###	 unpack()-Fix
	--###
 
	function CxTools:InitUnpackFix()
		if not unpack{true} then
			local unpack2;
			unpack2 =
				function(_table, _i)
					_i = _i or 1;
					assert(type(_table) == "table");
					if _i <= table.getn(_table) then
						return _table[_i], unpack2(_table, _i + 1);
					end
				end
 
			unpack = unpack2;    
		end
	end
 
	--#########################################################################
	--###
	--###	 Trigger Functions
	--###
 
	--Trigger-Fix / improvement
	function CxTools:InitTriggers()
		CxTools.tTriggers = {};
		CxTools.nTriggerNum = 0;
		CxTools.GlobalTriggerConditionCallbackWrapperName = "TriggerConditionCallbackWrapper";
		CxTools.GlobalTriggerActionCallbackWrapperName = "TriggerActionCallbackWrapper";
		CxTools.GlobalTriggerDebug = "MessageTriggerDebug";
 
		CxTools.Mission_OnSaveGameLoaded = Mission_OnSaveGameLoaded;
		Mission_OnSaveGameLoaded = function() CxTools:HookAPITrigger(); CxTools.Mission_OnSaveGameLoaded(); end;
		CxTools:HookAPITrigger();
 
		assert( not _G[CxTools.GlobalTriggerConditionCallbackWrapperName] );
		_G[CxTools.GlobalTriggerConditionCallbackWrapperName] = 
			function(_sId)
				return CxTools:callbackWrapperCondition(_sId);
			end
 
		assert( not _G[CxTools.GlobalTriggerActionCallbackWrapperName] );
		_G[CxTools.GlobalTriggerActionCallbackWrapperName] = 
			function(_sId)
				return CxTools:callbackWrapperAction(_sId);
			end
 
		--Comfort Functions
		CxTools.StartSimpleJobOrig = StartSimpleJob;
		StartSimpleJob = 
			 function(...)
				 return CxTools:StartSimpleJob(unpack(arg));
			 end
 
		CxTools.StartSimpleHiResJobOrig = StartSimpleHiResJob;
			StartSimpleHiResJob = 
				function(...)
					return CxTools:StartSimpleHiResJob(unpack(arg));
				end
 
		CxTools.StartJobOrig = StartJob;
		StartJob = 
			function(...)
				return CxTools:StartJob(unpack(arg));
			end
 
		CxTools.StartHiResJobOrig = StartHiResJob;
		StartHiResJob = 
			function(...)
				return CxTools:StartHiResJob(unpack(arg));
			end
 
 
		assert( not _G[CxTools.GlobalTriggerDebug] );
		_G[CxTools.GlobalTriggerDebug] = 
			function(_table)
				assert(type(_table) == "table");
				_table.seconds = _table.seconds or 0;
				_table.seconds = _table.seconds + 1;
				if math.mod(_table.seconds, 15) == 0 then
							Message("-----------------------------------------");
							Message("Error: " .. tostring(_table.text));
							Message("-----------------------------------------");
					if _table.seconds == 45 then
					return true;
				end
				end
			end
 
	end
 
	function CxTools:HookAPITrigger()
		CxTools.RequestTriggerOrig = Trigger.RequestTrigger;
		CxTools.UnrequestTriggerOrig = Trigger.UnrequestTrigger;
		Trigger.RequestTrigger = 
			function(_event, _fCond, _fAction, _isActive, _pCond, _pAction)
				return CxTools:AddTrigger(_event, _fCond, _fAction, _isActive, _pCond, _pAction);
			end
		Trigger.UnrequestTrigger =
			function( _id )
				CxTools:UnrequestTrigger( _id );
			end
	end
 
	function CxTools:AddTrigger( _eventType, _funcCondition, _funcAction, _isActive, _paramsCond, _paramsAction )
		assert(type(_eventType) == "number");
		assert(not _funcCondition or type(_funcCondition) == "string" or type(_funcCondition) == "function" );
		assert(type(_funcAction) == "string" or type(_funcAction) == "function");
 
		if _isActive == true then
			_isActive = 1;
		elseif _isActive == false then
			_isActive = 0;
		else
			assert( type(_isActive) == "number" and (_isActive == 0 or _isActive == 1) );
		end
 
		_paramsCond = _paramsCond or {};
		_paramsAction = _paramsAction or {};
 
		local sTriggerId = table.getn(CxTools.tTriggers) + 1;
		if sTriggerId > CxTools.nTriggerNum then
			CxTools.nTriggerNum = sTriggerId;
		end
 
		local entry = {};
		entry.sId = sTriggerId;
		if _funcCondition ~= "" then
			 entry.funcCondition = _funcCondition;
		end
		entry.funcAction = _funcAction;
		entry.paramsCond = _paramsCond;
		entry.paramsAction = _paramsAction;
 
		local condition = CxTools.GlobalTriggerConditionCallbackWrapperName;
		local action = CxTools.GlobalTriggerActionCallbackWrapperName;
		if not _funcCondition or _funcCondition == "" then
			condition = nil;
		end
 
		local realTriggerId = CxTools.RequestTriggerOrig( _eventType, condition, action, _isActive, {sTriggerId}, {sTriggerId} );
		entry.realId = realTriggerId;
 
		CxTools.tTriggers[sTriggerId] = entry;
 
		return realTriggerId;
	end
 
	function CxTools:callbackWrapperCondition( _sTriggerId )
		tRes = { xpcall( function() return CxTools:callbackWrapperConditionReal( _sTriggerId ); end, CxTools.Panic ) };
		table.remove( tRes, 1 );
		return unpack( tRes );
	end
 
	function CxTools:callbackWrapperConditionReal( _sTriggerId )
		assert(type( _sTriggerId) == "number" );
		local entry = CxTools.tTriggers[_sTriggerId];
		assert( entry );
		assert( entry.sId == _sTriggerId );
		assert( entry.funcCondition );
		assert( entry.paramsCond );
 
		local tRes;
		if type(entry.funcCondition) == "function" then
			tRes = { xpcall( function() return entry.funcCondition( unpack( entry.paramsCond ) ); end, CxTools.Panic ) };
		else
			local f = _G[entry.funcCondition];
			assert(type(f) == "function");
			tRes = { xpcall( function() return f( unpack( entry.paramsCond ) ); end, CxTools.Panic ) };
		end
 
		local bNoErr = table.remove( tRes, 1 );
 
		if not bNoErr then
			CxTools.tTriggers[_sTriggerId].err = true;
		end
 
		return bNoErr and unpack( tRes ) or not bNoErr;
	end
 
	function CxTools:callbackWrapperAction( _sTriggerId )
		tRes = { xpcall( function() return CxTools:callbackWrapperActionReal( _sTriggerId ); end, CxTools.PanicOrig ) };
		table.remove( tRes, 1 );
		return unpack( tRes );
	end
 
	function CxTools:callbackWrapperActionReal( _sTriggerId )
		assert(type( _sTriggerId) == "number" );
		local entry = CxTools.tTriggers[_sTriggerId];
		assert( entry );
		assert( entry.sId == _sTriggerId );
		assert( entry.funcAction );
		assert( entry.paramsAction );
 
		local bNoErr = true;
		local tRes;
		if not entry.err then
			if type(entry.funcAction) == "function" then
				tRes = { xpcall( function() return entry.funcAction( unpack( entry.paramsAction ) ); end, CxTools.Panic ) };
 
			else
				local f = _G[entry.funcAction];
				assert(type(f) == "function");
				tRes = { xpcall( function() return f( unpack( entry.paramsAction ) ); end, CxTools.Panic ) };
			end
 
			bNoErr = table.remove( tRes, 1 );
		end
 
		-- check return value
		if not bNoErr or entry.err or tRes[1] == true then
			-- Remove this entry, as the trigger is destroyed
			CxTools.tTriggers[_sTriggerId] = nil;
		end
 
		return entry.err or (bNoErr and unpack( tRes ) or not bNoErr);
	end 
 
	function CxTools:UnrequestTrigger( _id )
		--assert( type( _id ) == "number" );
		for i = 1, CxTools.nTriggerNum, 1 do
			local t = CxTools.tTriggers[i];
			if t and t.realId == _id then
				CxTools.tTriggers[i] = nil;
				break;
			end
		end
		CxTools.UnrequestTriggerOrig( _id );
	end
 
 
	--#########################################################################
	--###
	--###	 Trigger Comfort Functions
	--###
 
	function CxTools:StartSimpleJob( _functionname, ...)
		assert(type(_functionname) == "string" or type(_functionname) == "function");
 
		if type(_functionname) == "string" then
			if arg[1] == nil then 
				return CxTools.StartSimpleJobOrig( _functionname );
 
			else
				assert(type(_G[_functionname]) == "function");
				return Trigger.RequestTrigger( Events.LOGIC_EVENT_EVERY_SECOND, "", _functionname, 1, {}, arg );
			end
 
		else
			assert(type(_functionname) == "function");
			return Trigger.RequestTrigger( Events.LOGIC_EVENT_EVERY_SECOND, "", _functionname, 1, {}, arg );
		end
	end
 
	function CxTools:StartSimpleHiResJob( _functionname, ...)
		assert(type(_functionname) == "string" or type(_functionname) == "function");
 
		if type(_functionname) == "string" then
			if arg[1] == nil then 
				return CxTools.StartSimpleHiResJobOrig( _functionname );
 
			else
				assert(type(_G[_functionname]) == "function");
				return Trigger.RequestTrigger( Events.LOGIC_EVENT_EVERY_TURN, "", _functionname, 1, {}, arg );
			end
 
		else
			assert(type(_functionname) == "function");
			return Trigger.RequestTrigger( Events.LOGIC_EVENT_EVERY_TURN, "", _functionname, 1, {}, arg );
		end
	end
 
	function CxTools:StartJob( _functionname, ... )
		assert(type(_functionname) == "string" or (type(_functionname) == "function" and type(arg[1]) == "function"));
 
		if type(_functionname) == "string" then
 
			assert(type(_G["Action_".._functionname]) == "function" and type(_G["Condition_".._functionname]) == "function");
 
			if arg[1] == nil then
				return CxTools.StartJobOrig(_functionname);
 
			else
				assert(type(arg[1]) == "table" and (not arg[2] or type(arg[2]) == "table"));
				return Trigger.RequestTrigger(Events.LOGIC_EVENT_EVERY_SECOND, "Condition_".._functionname, "Action_".._functionname, 1, arg[2], arg[1]);
			end
		else
			 assert((not arg[2] or type(arg[2]) == "table") and (not arg[3] or type(arg[3]) == "table"));
			 return Trigger.RequestTrigger(Events.LOGIC_EVENT_EVERY_SECOND, arg[1], _functionname, 1, arg[3], arg[2]);
		 end
	end
 
	function CxTools:StartHiResJob( _functionname, ... )
		assert(type(_functionname) == "string" or (type(_functionname) == "function" and type(arg[1]) == "function"));
 
		if type(_functionname) == "string" then
 
			assert(type(_G["Action_".._functionname]) == "function" and type(_G["Condition_".._functionname]) == "function");
 
			if arg[1] == nil then
				return CxTools.StartHiResJobOrig(_functionname);
 
			else
				assert(type(arg[1]) == "table" and (not arg[2] or type(arg[2]) == "table"));
				return Trigger.RequestTrigger(Events.LOGIC_EVENT_EVERY_TURN, "Condition_".._functionname, "Action_".._functionname, 1, arg[2], arg[1]);
			end
		else
			assert((not arg[2] or type(arg[2]) == "table") and (not arg[3] or type(arg[3]) == "table"));
			return Trigger.RequestTrigger(Events.LOGIC_EVENT_EVERY_TURN, arg[1], _functionname, 1, arg[3], arg[2]);
		end
	end
 
	--#########################################################################
	--###
	--###	 Init!
	--###
 
	CxTools:Init();

Winkel & GetDistance

Autor mir leider unbekannt FIXME

	Winkel = function(_Pos1,_Pos2)
		local delta_X = 0;
		local delta_Y = 0;
		local alpha   = 0
		if type (_Pos1) == "string" or type (_Pos1) == "number" then
			_Pos1 = GetPosition(GetEntityId(_Pos1));
		end
		if type (_Pos2) == "string" or type (_Pos2) == "number" then
			_Pos2 = GetPosition(GetEntityId(_Pos2));
		end
		delta_X = _Pos1.X - _Pos2.X
		delta_Y = _Pos1.Y - _Pos2.Y
		if delta_X == 0 and delta_Y == 0 then -- Gleicher Punkt
			return 0
		end
		alpha = math.deg(math.asin(math.abs(delta_X)/(math.sqrt(__pow(delta_X, 2)+__pow(delta_Y, 2)))))
		if delta_X >= 0 and delta_Y > 0 then
			alpha = 270 - alpha 
		elseif delta_X < 0 and delta_Y > 0 then
			alpha = 270 + alpha
		elseif delta_X < 0 and delta_Y <= 0 then
			alpha = 90  - alpha
		elseif delta_X >= 0 and delta_Y <= 0 then
			alpha = 90  + alpha
		end
		return alpha
	end	
	GetDistance = function(_a, _b)
		if type(_a) ~= "table" then
			_a = GetPosition(_a); 
		end
		if type(_b) ~= "table" then
			_b = GetPosition(_b); 
		end
		return math.sqrt((_a.X - _b.X)^2+(_a.Y - _b.Y)^2)
	end

Umlaute

Autor mir leider unbekannt FIXME

	function Umlaute( _text )
		local texttype = type( _text );
		if texttype == "string" then
			_text = string.gsub( _text, "ä", "\195\164" );
			_text = string.gsub( _text, "ö", "\195\182" );
			_text = string.gsub( _text, "ü", "\195\188" );
			_text = string.gsub( _text, "ß", "\195\159" );
			_text = string.gsub( _text, "Ä", "\195\132" );
			_text = string.gsub( _text, "Ö", "\195\150" );
			_text = string.gsub( _text, "Ü", "\195\156" );
			return _text;
		elseif texttype == "table" then
			for k,v in _text do
				_text[k] = Umlaute( v );
			end
			return _text;
		else
			return _text;
		end 
	end
 
	function AutoUmlaut()
		StartBriefingUmlauteOrig = StartBriefing;
		StartBriefing = function( _briefing )
			StartBriefingUmlauteOrig( Umlaute( _briefing ) );
		end
 
		CreateNPCUmlauteOrig = CreateNPC;
		CreateNPC = function( _npc )
			CreateNPCUmlauteOrig( Umlaute( _npc ) );
		end
 
		MessageUmlauteOrig = Message;
		Message = function( _text )
			MessageUmlauteOrig( Umlaute( tostring( _text ) ) );
		end 
		XGUIEng.SetTextOrig = XGUIEng.SetText;
		XGUIEng.SetText = function(_a,_text)
			XGUIEng.SetTextOrig(_a, Umlaute( tostring( _text ) ))
		end
	end
 
	AutoUmlaut()

GUI Hacks

Diese GUI Hacks müssen irgendwo VOR SetupWalls() ins Skript
Die Hacks werden dann in SetupWalls initialisiert
ACHTUNG! Die Hacks überschneiden sich mit eigenen Hacks. Bitte nutzt die Vorlage wie in Setupwalls mit table.insert(…) BeforeOrig oder AfterOrig für eure eigenen Hacks dieser Funktionen.

Hier ein GUIHack Comfort

SetupGUIHack = function(_gui,_mothertable)
	_mothertable = _mothertable or 0
	if _mothertable ~= 0 then
		if not(type(_G[_mothertable][_gui.."_BeforeOrig"]) == "table") then
			_G[_mothertable][_gui.."_BeforeOrig"] = {}
			_G[_mothertable][_gui.."_AfterOrig"] = {}
			_G[_mothertable][_gui.."_OrigProtected"] = _G[_mothertable][_gui]
			_G[_mothertable][_gui] = function(...)
				local DoOrig = true
				local _result
				for i = 1,table.getn(_G[_mothertable][_gui.."_BeforeOrig"]) do if _G[_mothertable][_gui.."_BeforeOrig"][i](unpack(arg)) == false then DoOrig = false end end
				if DoOrig then _result = _G[_mothertable][_gui.."_OrigProtected"](unpack(arg)) end
				for i = 1,table.getn(_G[_mothertable][_gui.."_AfterOrig"]) do _G[_mothertable][_gui.."_AfterOrig"][i](unpack(arg)) end
				return _result
			end
		end
	else
		if not(type(_G[_gui.."_BeforeOrig"]) == "table") then
			_G[_gui.."_BeforeOrig"] = {}
			_G[_gui.."_AfterOrig"] = {}
			_G[_gui.."_OrigProtected"] = _G[_gui]
			_G[_gui] = function(...)
				local DoOrig = true
				local _result
				for i = 1,table.getn(_G[_gui.."_BeforeOrig"]) do if _G[_gui.."_BeforeOrig"][i](unpack(arg)) == false then DoOrig = false end end --_G[_gui.."_BeforeOrig"][i](unpack(arg)) end
				if DoOrig then _result = _G[_gui.."_OrigProtected"](unpack(arg)) end
				for i = 1,table.getn(_G[_gui.."_AfterOrig"]) do _G[_gui.."_AfterOrig"][i](unpack(arg)) end
				return _result
			end
		end
	end
end

Und hier mal quer ein paar GUI Hacks. Mit denen ist mindestens der Mauercomfort abgedeckt

	SetupGUIHack("GUITooltip_ConstructBuilding")
	SetupGUIHack("SellBuilding","GUI")
	SetupGUIHack("GUIAction_DoNotDestroyBuilding")
	SetupGUIHack("GameCallback_OnBuildingConstructionComplete")
	SetupGUIHack("GUITooltip_ResearchTechnologies")
	SetupGUIHack("GUIUpdate_Armor")
	SetupGUIHack("MPTrade_ChangeResourceAmount","GUI")
	SetupGUIHack("KeyBindings_TogglePause")
	SetupGUIHack("GUIAction_PlaceBuilding")
	SetupGUIHack("GUIAction_BlessSettlers")
	SetupGUIHack("GUITooltip_UpgradeBuilding")
	SetupGUIHack("GUIAction_ToggleMenu")
	SetupGUIHack("GameCallback_GUI_SelectionChanged")