[MOD] GetWarmongerThreat always returns -1

Wichilie

Chieftain
Joined
Nov 9, 2017
Messages
6
Hey, I'm working on an UA that gives a player's units a promotion based on the highest warmongering level out of everyone that player is at war with. This is what I have right now:

Code:
-- AssignAntiWarmongererStrength
-- Author: Wichilie
-- DateCreated: 12/16/2017 11:19:53 PM
--------------------------------------------------------------
print("Loading AssignAntiWarmongererStrength.lua...")
local iRequiredCiv = GameInfoTypes.CIVILIZATION_DEMACIA
local lPromotions = {GameInfo.UnitPromotions["PROMOTION_JUSTICE_1"].ID, GameInfo.UnitPromotions["PROMOTION_JUSTICE_2"].ID, GameInfo.UnitPromotions["PROMOTION_JUSTICE_3"].ID, GameInfo.UnitPromotions["PROMOTION_JUSTICE_4"].ID}

function AssignAntiWarmongererStrength(iTeam1, iTeam2, bWar)
    print("War update detected")
    -- Check if the required civ got a war update.
    for i = 0, GameDefines.MAX_CIV_PLAYERS - 1, 1 do
        local pPlayer = Players[i]
        local iTeam = pPlayer:GetTeam()
        if pPlayer:GetCivilizationType() == iRequiredCiv and (iTeam == iTeam1 or iTeam == iTeam2) then
            print("Required Civ got a war update")

            -- Go through every civ the required civ is at war with.
            local lWarmongeringStatus = {}
            for j = 0, GameDefines.MAX_CIV_PLAYERS - 1, 1 do
                local pOpponent = Players[j]
                if pOpponent ~= pPlayer and Teams[iTeam]:IsAtWar(pOpponent:GetTeam()) then
                   
                    -- Compile a list of the opponents warmongering status.
                    print(pOpponent:GetCivilizationType())
                    print(pPlayer:GetWarmongerThreat(pOpponent))
                    table.insert(lWarmongeringStatus, pPlayer:GetWarmongerThreat(pOpponent))
                end
            end

            -- Assign the right promotion based on the warmongering status
            if next(lWarmongeringStatus) ~= nil then
                table.sort(lWarmongeringStatus)
                local iHighestWarmongerThreat = lWarmongeringStatus[#lWarmongeringStatus]
                if iHighestWarmongerThreat > 0 then
                    for pUnit in pPlayer:Units() do
                        for j = 0, table.getn(lPromotions), 1 do
                            if j == iHighestWarmongerThreat - 1 then
                                pUnit:SetHasPromotion(lPromotions[j], true)
                            else
                                pUnit:SetHasPromotion(lPromotions[j], false)
                            end
                        end
                    print("Promotions have been given")
                    end
                else
                    print("No promotions given: warmongering status too low")
                end
            end
        end
    end
end

Events.WarStateChanged.Add(AssignAntiWarmongererStrength)
print("Loaded AssignAntiWarmongererStrength.lua.")

However, no matter how big of a warmongerer the opponent is, GetWarmongerThreat always returns -1 (print(pPlayer:GetWarmongerThreat(pOpponent)) always gives -1). This means the promotion is never given ("No promotions given: warmongering status too low" is always printed). Does anyone know what I'm doing wrong?
 
You are sending a player object instead of a player ID #.

From William Howard's BNW API saved into a text file as XML:
Code:
  <api object="Player" method="GetWarmongerThreat">
      <arg pos="2" type="PlayerTypes" name="eOtherPlayer"/>
      <ret type="int"/>
  </api>
This always signifies in his file that a Player ID# is required.
type="PlayerTypes"
--------------------------------------------

I cannot really think of an instance where the API wants a Player Object as an argument between the "()" for any lua method.

--------------------------------------------

Also I'm not sure whether the GetWarmongerThreat method gives the threat level as seen by "eOtherPlayer", or whether it gives the threat level of "eOtherPlayer" as seen by "pPlayer".
 
You are sending a player object instead of a player ID #.

Aah, right. Changing that fixed it, thanks!

Also I'm not sure whether the GetWarmongerThreat method gives the threat level as seen by "eOtherPlayer", or whether it gives the threat level of "eOtherPlayer" as seen by "pPlayer".

The latter is the case.
 
Back
Top Bottom