I did the same thing for a dwarvenbuilding today and it worked perfectly. Im not sure if it might help u for elvenbuildings but i could give u a short instruction how i did it. First u need to go to data/ini... then u search "playertemplate" open the first document. Then u look for the faction u want to add the heroes so lets say elves, press Ctrl + F to search for "PlayerTemplate FactionElves" there u ll find this:
PlayerTemplate FactionElves
Side = Elves
PlayableSide = Yes ; Please note: the presence of "SIDE:Elves" in the string file is what makes this appear in MP as a playable side. And the skirmish scripts are what actually make it function.
Evil = No
StartMoney = 0
MaxLevelMP = #DIVIDE( PLAYER_MAX_PURCHASE_POINTS_DEFAULT PLAYER_PURCHASE_POINTS_GRANTED )
MaxLevelSP = #DIVIDE( PLAYER_MAX_PURCHASE_POINTS_GOOD PLAYER_PURCHASE_POINTS_GRANTED )
PreferredColor = R:43 G:150 B:179
;StartingBuilding = LothlorienFortress
;------------- NO STARTING UNITS FOR YOU -------
StartingUnit0 = ElvenLorienWarriorHorde ;_StartUnit
StartingUnitOffset0 = X:-70 Y:220 Z:0
StartingUnit1 = ElvenLorienWarriorHorde ;_StartUnit
StartingUnitOffset1 = X:60 Y:270 Z:0 ;250
StartingUnitTacticalWOTR = ElvenLorienWarriorHorde
StartingUnitTacticalWOTR = ElvenLorienWarriorHorde
StartingUnitTacticalWOTR = ObjectRingkriegStartScript
IntrinsicSciences = SCIENCE_GOOD
IntrinsicSciencesMP = SCIENCE_ELVES
SpellBook = GoodSpellBook
SpellBookMp = ElvesSpellBook_MapMirkwood
PurchaseScienceCommandSet = GoodSpellStoreCommandSet
PurchaseScienceCommandSetMP = ElvesSpellStoreCommandSet_MapMirkwood
DisplayName = INI:FactionElves
DefaultPlayerAIType = ElvesSkirmishAI ; Needs to exist before I can change it.
BeaconName = MultiplayerBeacon
LightPointsUpSound = GondorLightPointsUp
ObjectiveAddedSound = Gui_MissionObjectiveNew
ObjectiveCompletedSound = Gui_MissionObjectiveCompleted
InitialUpgrades = Upgrade_ElfFaction Upgrade_LothlorienFaction Upgrade_AllFactionUpgrade ; Any upgrades this player template is born with.
// NOTE: It is very important that the create-a-hero be the first buildable hero, to ensure that the create-a-hero and the ring hero are always
// attached to the first two buttons in the command set.
BuildableHeroesMP = CreateAHero RohanFrodo_mod RohanSam_mod LothlorienRumil LothlorienHaldir LothlorienCeleborn LothlorienGaladriel LothlorienTauriel LothlorienLegolas GasthausGrimbeorn ElvenThranduil_mod
BuildableRingHeroesMP = RingHeroDummy
SpellStoreCurrentPowerLabel = APT:SpellStoreCurrentEvenstarPower
SpellStoreMaximumPowerLabel = APT:SpellStoreMaximumEvenstarPower
ResourceModifierObjectFilter = RESOURCE_MODIFIER_OBJECT_FILTER
ResourceModifierValues = 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100
MultiSelectionPortrait = UPElvenArmy
LoadScreenMusic = Shell2MusicForLoadScreenLothlorien ;Shell2MusicForLoadScreen
End
The BuildableHeroesMP Define which heroes u can build at all in the whole game i think. That means You have to add a commandset of ~"RevivableRinghero" CaHReviveSlot "FakeheroReviveslot" and "GenericReviveSlot". Generic with a numer means u can see the buildable hero, fakeHeroRS means u cannot see it but exists i think. So u just Check in BuildableHeroesMP which hero u want to build and give them their correspondent number but u dont count the Create A Hero and ringhero ( not sure about this), so u just start with the real hero in this case it should be LothlorienHaldir with number 1
CommandSet LothlorienCastleBaseKeepCommandSet_MapMirkwood2
InitialVisible = 11
1 = Command_ConstructElvenLorienWarriorHorde
2 = Command_ConstructElvenLorienArcherHorde
3 = Command_ConstructElvenLorienPikemanHorde
4 = Command_ConstructLothlorienSängerinnen
5 = Command_ConstructLothlorienGaladhrimHorde
6 = Command_ConstructLothlorienCarasGuardHorde
7 = Command_ConstructMirkwoodWächterPfadeHorde
8 = Command_ConstructDwarvenKhazadVeteranenHorde
9 = Command_RingMechanikLothlorien
10 = Command_SelectRevivablesLothlorienCastleKeepHeroes_MapMirkwood
11 = Command_StartCitadelSelfRepair
12 = Command_FakeRingHeroReviveSlot
13 = Command_CreateAHeroReviveSlot
14 = Command_FrodoRingHeroReviveSlot
15 = Command_SamRingHeroReviveSlot
16 = Command_HaldirsBrüderGenericReviveSlot
17 = Command_GenericReviveSlot1
18 = Command_GenericReviveSlot2
19 = Command_GenericReviveSlot3
20 = Command_FakeHeroReviveSlot5
22 = Command_FakeHeroReviveSlot6
23 = Command_FakeHeroReviveSlot7
24 = Command_FakeHeroReviveSlot8
25 = Command_RadialBack
End
So that means if u want him in the building write GenericReviveSlot, if not u just write FakeHeroReviveSlot like in the codeexample.
I hope it wasnt too confusing because i just got one map. ini on this pc (I think it was your map.ini from Woodlandrealm)
P.S ignore the KhazadVeteranen, i changed it for a custom map
Regards