Tribute und MercantTent

» Siedler Map Source Forum » Siedler DEdK Script Forum » Tribute und MercantTent

Seiten: 1

BrokenSun
#1
19.11.2017 22:29
Beiträge: 73

Tribute und MercantTent

Es ist mal wieder so weit. Ich hab kein Plan was fehlt.
Die Tribute funktionieren nicht.
Das SoeldnerQuartierB sagt mit irgendwas von "Belegt von (NULL)"

--------------------------------------------------------------------------------
-- MapName: XXX
--
-- Author: XXX
--
--------------------------------------------------------------------------------

function GameCallback_OnGameStart() 	
	
	-- Include global tool script functions	
	Script.Load(Folders.MapTools.."Ai\\Support.lua")
	Script.Load( "Data\\Script\\MapTools\\MultiPlayer\\MultiplayerTools.lua" )	
	Script.Load( "Data\\Script\\MapTools\\Tools.lua" )	
	Script.Load( "Data\\Script\\MapTools\\WeatherSets.lua" )
	IncludeGlobals("Comfort")
	
	--Init local map stuff
	Mission_InitWeatherGfxSets()
	Mission_InitWeather()
	Mission_InitGroups()	
	Mission_InitLocalResources()
	
	-- Init  global MP stuff
	--MultiplayerTools.InitResources("normal")
	MultiplayerTools.InitCameraPositionsForPlayers()	
	MultiplayerTools.SetUpGameLogicOnMPGameConfig()
	MultiplayerTools.GiveBuyableHerosToHumanPlayer( 0 )
	
	if XNetwork.Manager_DoesExist() == 0 then		
		for i=1,2,1 do
			MultiplayerTools.DeleteFastGameStuff(i)
		end
		local PlayerID = GUI.GetPlayerID()
		Logic.PlayerSetIsHumanFlag( PlayerID, 1 )
		Logic.PlayerSetGameStateToPlaying( PlayerID )
	end
	
	LocalMusic.UseSet = HIGHLANDMUSIC

local SoeldnerQuartier1 = GetEntityId( "SoeldnerQuartier1" );
Logic.AddMercenaryOffer( SoeldnerQuartier1, Entities.PU_Serf, 99, ResourceType.Gold, 15 );
Logic.AddMercenaryOffer( SoeldnerQuartier1, Entities.PU_LeaderSword2, 99, ResourceType.Gold, 30, ResourceType.Iron, 50 );
Logic.AddMercenaryOffer( SoeldnerQuartier1, Entities.PU_LeaderPoleArm2, 99, ResourceType.Gold, 15, ResourceType.Wood, 20);
Logic.AddMercenaryOffer( SoeldnerQuartier1, Entities.PU_LeaderBow2, 99, ResourceType.Gold, 30, ResourceType.Iron, 10, ResourceType.Wood, 20 );
    
local SoeldnerQuartierB = GetEntityId( "SoeldnerQuartierB" );
Logic.AddMercenaryOffer( SoeldnerQuartierB, Entities.PU_Serf, 99, ResourceType.Gold, 15 );
Logic.AddMercenaryOffer( SoeldnerQuartierB, Entities.PU_LeaderSword2, 99, ResourceType.Gold, 30, ResourceType.Iron, 50 );
Logic.AddMercenaryOffer( SoeldnerQuartierB, Entities.PU_LeaderPoleArm2, 99, ResourceType.Gold, 15, ResourceType.Wood, 20);
Logic.AddMercenaryOffer( SoeldnerQuartierB, Entities.PU_LeaderBow2, 99, ResourceType.Gold, 30, ResourceType.Iron, 10, ResourceType.Wood, 20 );
    
AddTribute( _tribute )
GameCallback_FulfillTribute()
    
TradeOneSP1()
TradeTwoSP1()
TradeThreeSP1()
TradeFourSP1()
TradeFiveSP1()
TradeSixSP1()
end

--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- This function is called on game start and after save game is loaded, setup your weather gfx
-- sets here
function Mission_InitWeatherGfxSets()
	
	-- Use gfx sets
	SetupHighlandWeatherGfxSet()

end

--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- This function is called on game start you should setup your weather periods here
function Mission_InitWeather()
	
	-- Init with gfx set 1
	AddPeriodicSummer(10)

end

--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- Build Groups and attach Leaders
function Mission_InitGroups()
		
end

--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- Limit the Technologies here. For example Weathermashine.
function
Mission_InitTechnologies()
	--no limitation in this map
end

--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- Set local resources
function
Mission_InitLocalResources()


	local HumenPlayer = XNetwork.GameInformation_GetMapMaximumNumberOfHumanPlayer()
	
	-- Initial Resources
	local InitGoldRaw 		= 100
	local InitClayRaw 		= 250
	local InitWoodRaw 		= 250
	local InitStoneRaw 		= 100
	local InitIronRaw 		= 50
	local InitSulfurRaw		= 20

	
	--Add Players Resources
	local i
	for i=1,8,1
	do
		Tools.GiveResouces(i, InitGoldRaw , InitClayRaw,InitWoodRaw, InitStoneRaw,InitIronRaw,InitSulfurRaw)
	end
end

--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- Tribute


function AddTribute( _tribute )
      assert( type( _tribute ) == "table", "Tribut muß ein Table sein" );
    assert( type( _tribute.text ) == "string", "Tribut.text muß ein String sein" );
    assert( type( _tribute.cost ) == "table", "Tribut.cost muß ein Table sein" );
      assert( type( _tribute.playerId ) == "number", "Tribut.playerId muß eine Nummer sein" );
      assert( not _tribute.Tribute , "Tribut.Tribute darf nicht vorbelegt sein");
      
      uniqueTributeCounter = uniqueTributeCounter or 1;
      _tribute.Tribute = uniqueTributeCounter;
      uniqueTributeCounter = uniqueTributeCounter + 1;
      
      local tResCost = {};
      for k, v in pairs( _tribute.cost ) do
            assert( ResourceType[k] );
            assert( type( v ) == "number" );
            table.insert( tResCost, ResourceType[k] );
            table.insert( tResCost, v );
      end
      
      Logic.AddTribute( _tribute.playerId, _tribute.Tribute, 0, 0, _tribute.text, unpack( tResCost ) );
      SetupTributePaid( _tribute );
      
      return _tribute.Tribute;
end

function GameCallback_FulfillTribute()
    return 1
end

--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- Tribute SP1-A
function TradeOneSP1() 
local tribute =  {};
tribute.playerId = 1;
tribute.text = " @color:0,238,0 Handel - 25 Holz / 25 Taler gegen 20 Lehm";
tribute.cost = { Clay = 20 };
tribute.Callback = OnTestTributePaid1;
AddTribute( tribute );
end


--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- Tribute SP1-B
function TradeTwoSP1() 
local tribute =  {};
tribute.playerId = 1;
tribute.text = " @color:0,238,0 Handel - 25 Holz / 25 Taler gegen 20 Stein";
tribute.cost = { Stone = 20 };
tribute.Callback = OnTestTributePaid2;
AddTribute( tribute );
end

--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- Tribute SP1-C
function TradeThreeSP1() 
local tribute =  {};
tribute.playerId = 1;
tribute.text = " @color:0,238,0 Verteidigungtruppen (Leicht) - 100 Taler / 50 Holz / 50 Eisen";
tribute.cost = { Wood = 50 };
tribute.cost = { Gold = 100 };
tribute.cost = { Iron = 50 };
tribute.Callback = OnTestTributePaid3;
AddTribute( tribute );
end

--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- Tribute SP1-D
function TradeFourSP1() 
local tribute =  {};
tribute.playerId = 1;
tribute.text = " @color:0,238,0 Verteidigungstruppen (Stark) - 200 Taler / 80 Holz / 150 Eisen";
tribute.cost = { Wood = 80 };
tribute.cost = { Gold = 200 };
tribute.cost = { Iron = 150 };
tribute.Callback = OnTestTributePaid4;
AddTribute( tribute );
end

--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- Tribute SP1-E
function TradeFiveSP1() 
local tribute =  {};
tribute.playerId = 1;
tribute.text = " @color:0,238,0 Angriffstruppen - 150 Taler / 120 Holz / 100 Eisen";
tribute.cost = { Wood = 120 };
tribute.cost = { Gold = 150 };
tribute.cost = { Iron = 100 };
tribute.Callback = OnTestTributePaid5;
AddTribute( tribute );
end

--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- Tribute SP1-F
function TradeSixSP1() 
local tribute =  {};
tribute.playerId = 1;
tribute.text = " @color:0,238,0 Holz (400 Taler)";
tribute.cost = { Gold = 400 };
tribute.Callback = OnTestTributePaid6;
AddTribute( tribute );
end


-- Tribute Paid
function OnTestTributePaid1()
AddGold(1, 25);
AddWood(1, 25);
end

function OnTestTributePaid2()
AddGold(1, 25);
AddWood(1, 25);
end







Schonmal Danke für die Rückmeldungen

mcb
#2
19.11.2017 22:55
Beiträge: 1472

Was mir auffällt, ist das du in der GameCallback_OnGameStart AddTribute( _tribute ) aufrufst, was allerdings einen Fehler produziert, da _tribute nicht definiert ist.
Außerdem rufst du direkt darunter GameCallback_FulfillTribute() auf, was völlig unnötig ist. Diese Funktion wird vom C++ Code aufgerufen, um zu erfahren, ob Tribute überhaupt verwendet werden sollen (selbst aufrufen, macht daher keinen Sinn).
Die beiden Zeilen entfernen und es sollte schon mal besser funktionieren

BrokenSun
#3
19.11.2017 23:14
Beiträge: 73

Es handelt sich um eine Multiplayer Map, daher wird das Callback gebraucht um die Tribute zu initialisieren...
Bei Add Tribute wirst du wahrscheinlich recht haben
Danke

BalistiK
#4
19.11.2017 23:17
Beiträge: 70

Also bei dem Söldnerquartier ist nichts falsch. Wenn der Fehler noch da ist weiß ich da auch nicht weiter. Würde aber an deiner Stelle die Söldnerquartiere lieber in einer eigenen Funktion aufrufen. Alles was man in eine eigene Funktion auslagern kann sorgt für mehr Übersichtlichkeit, da du die Funktion schneller finden und Fehler schneller beheben kannst

Edit: Söldnerquartier funktioniert (im Singleplayer getestet)

mcb
#5
19.11.2017 23:23
Beiträge: 1472

Das überschreiben machst du mit

function GameCallback_FulfillTribute()
    return 1
end

ohne das funktioniert es nicht. Der Aufruf GameCallback_FulfillTribute() in der GameCallback_OnGameStart ist aber unnötig, dort passiert genau nix (Kannst ja einfach mal mit und ohne ausprobieren, es wird keinen Unterschied geben)

Zum Söldnerquartier: Stimmt der Entityname?

BrokenSun
#6
21.11.2017 20:54
Beiträge: 73

Hat übrigens alles hingehauen

Seiten: 1

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

Impressum