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?
Seiten: 1