Jump to content

R&D XCOM Map Alterations


Amineri

Recommended Posts

Great work (: However, if we use the XGBattle_SP.PostLevelLoaded function would the the map placement mod be independent of Longwar? I realy don't care about anything not longwar related but others would surely appreciate. About the LZ rotation : there is an alternative for using a different stream, the highlight is rotatable but the volume is not, i could rotate it by moding it's mesh cordinates. So which approach would it be? PierStreamB or volume edit? I checked if the Anna Song stream works in EW, well it doesn't.. the map loads but crashes after I see the lz. I don't think the spawnpoint problem is related to the names.. in the stream they are 6-11, but they work in some maps that have 1-6. ps:sorry If I misspell some words but english isn't my mother tongue and I really don't want to google each word spell xD

 

@johnnylump, I am messing around with other streams too.. it seems we put a hostage/bomb on an abduction missions. An idea : put back the 3 missions on the hologlobe and add make a bomb/hostage for ALL the maps.. well instead of "abductions" we'll have "alien situations"

 

Exalt extraction streams don't work with simple swap of files on abduction because the operative is a regular soldier that doesn't have the hack skill.

 

Exalt capture and holds works too! the aliens go towards the capture point and sectoids drop from choppers :D But there is no operative that can hack

Edited by LiQuiD911
Link to comment
Share on other sites

  • Replies 473
  • Created
  • Last Reply

Top Posters In This Topic

LiQuiD911, rotated LZ example:

 

 

UPK_FILE=XComGame.upk

ALIAS=PlayerStart:<%f 1583> <%f 1871> <%f 64>
ALIAS=XComBuildingVolume:<%f 1819> <%f 1862> <%f 121>
ALIAS=XComLevelActor:<%f 1804> <%f 1882> <%f 27>
ALIAS=XComSpawnPoint1:<%f 1388> <%f 1670> <%f 75>
ALIAS=XComSpawnPoint2:<%f 1580> <%f 1670> <%f 75>
ALIAS=XComSpawnPoint3:<%f 1388> <%f 2054> <%f 75>
ALIAS=XComSpawnPoint4:<%f 1292> <%f 1862> <%f 75>
ALIAS=XComSpawnPoint5:<%f 1580> <%f 2054> <%f 75>
ALIAS=XComSpawnPoint6:<%f 1484> <%f 1862> <%f 75>
ALIAS=PointInSpace:<%f 1340> <%f 1622> <%f 27>

/*[ADD_EXPORT_ENTRY]
<Core.ObjectProperty>			// Type
<NullRef>						// ParentClassRef
<XGBattle_SP.PostLevelLoaded>	// OwnerRef
<A>								// NameIdx
<NullRef>						// ArchetypeRef
<% u0x00000000>					// flags H
<% u0x00070004>					// flags L
<%u 44>							// serial size
<%u 0>							// serial offset
<%u 0>							// export flags
<%u 0>							// net objects count
<%u 0>							// GUID1
<%u 0>							// GUID2
<%u 0>							// GUID3
<%u 0>							// GUID4
<%u 0>							// unknown

OBJECT=XGBattle_SP.PostLevelLoaded.A
REL_OFFSET=16					// skip PrevObjRef + Empty DefaultProperties List + NextObjRef
[MODDED_CODE]
<%s 1>							// ArrayDim
<%s 0>							// ElementSize
<%u 0x00000000>					// flags L
<%u 0x00000000>					// flags H
<None>							// CategoryIndex
<NullRef>						// ArrayEnumRef
<Engine.Actor>					// OtherObjRef
*/
OBJECT=XGBattle_SP.PostLevelLoaded:AUTO
[REPLACEMENT_CODE]
//super.PostLevelLoaded()
1C <XGBattle.PostLevelLoaded> 16

//FindActorByName('PlayerStart_1', A)
1C <Engine.Actor.FindActorByName> 21 <PlayerStart_1> 00 <.A> 16
//A.Location = vect(x, y, z)
0F 19 00 <.A> 09 00 <Engine.Actor.Location> 00 01 <Engine.Actor.Location>
23 <!PlayerStart>
//A.Rotation = vect(P, Y, R)
0F 19 00 <.A> 09 00 <Engine.Actor.Rotation> 00 01 <Engine.Actor.Rotation>
22 <%i 0> <%i 16384> <%i 0>

//FindActorByName('PointInSpace_0', A)
1C <Engine.Actor.FindActorByName> 21 <PointInSpace_0> 00 <.A> 16
//A.Location = vect(x, y, z)
0F 19 00 <.A> 09 00 <Engine.Actor.Location> 00 01 <Engine.Actor.Location>
23 <!PointInSpace>
//A.Rotation = vect(P, Y, R)
0F 19 00 <.A> 09 00 <Engine.Actor.Rotation> 00 01 <Engine.Actor.Rotation>
22 <%i 0> <%i 16384> <%i 0>

//FindActorByName('XComBuildingVolume_4', A)
1C <Engine.Actor.FindActorByName> 21 <XComBuildingVolume_4> 00 <.A> 16
//A.Location = vect(x, y, z)
0F 19 00 <.A> 09 00 <Engine.Actor.Location> 00 01 <Engine.Actor.Location>
23 <!XComBuildingVolume>
//A.Rotation = vect(P, Y, R)
0F 19 00 <.A> 09 00 <Engine.Actor.Rotation> 00 01 <Engine.Actor.Rotation>
22 <%i 0> <%i 16384> <%i 0>

//FindActorByName('XComLevelActor_69', A)
1C <Engine.Actor.FindActorByName> 21 <XComLevelActor_69> 00 <.A> 16
//A.Location = vect(x, y, z)
0F 19 00 <.A> 09 00 <Engine.Actor.Location> 00 01 <Engine.Actor.Location>
23 <!XComLevelActor>
//A.Rotation = vect(P, Y, R)
0F 19 00 <.A> 09 00 <Engine.Actor.Rotation> 00 01 <Engine.Actor.Rotation>
22 <%i 0> <%i 16384> <%i 0>

//FindActorByName('XComSpawnPoint_3', A)
1C <Engine.Actor.FindActorByName> 21 <XComSpawnPoint_3> 00 <.A> 16
//A.Location = vect(x, y, z)
0F 19 00 <.A> 09 00 <Engine.Actor.Location> 00 01 <Engine.Actor.Location>
23 <!XComSpawnPoint1>
//A.Rotation = vect(P, Y, R)
0F 19 00 <.A> 09 00 <Engine.Actor.Rotation> 00 01 <Engine.Actor.Rotation>
22 <%i 0> <%i 32064> <%i 0>

//FindActorByName('XComSpawnPoint_5', A)
1C <Engine.Actor.FindActorByName> 21 <XComSpawnPoint_5> 00 <.A> 16
//A.Location = vect(x, y, z)
0F 19 00 <.A> 09 00 <Engine.Actor.Location> 00 01 <Engine.Actor.Location>
23 <!XComSpawnPoint2>
//A.Rotation = vect(P, Y, R)
0F 19 00 <.A> 09 00 <Engine.Actor.Rotation> 00 01 <Engine.Actor.Rotation>
22 <%i 0> <%i 32064> <%i 0>

//FindActorByName('XComSpawnPoint_6', A)
1C <Engine.Actor.FindActorByName> 21 <XComSpawnPoint_6> 00 <.A> 16
//A.Location = vect(x, y, z)
0F 19 00 <.A> 09 00 <Engine.Actor.Location> 00 01 <Engine.Actor.Location>
23 <!XComSpawnPoint3>
//A.Rotation = vect(P, Y, R)
0F 19 00 <.A> 09 00 <Engine.Actor.Rotation> 00 01 <Engine.Actor.Rotation>
22 <%i 0> <%i 32064> <%i 0>

//FindActorByName('XComSpawnPoint_7', A)
1C <Engine.Actor.FindActorByName> 21 <XComSpawnPoint_7> 00 <.A> 16
//A.Location = vect(x, y, z)
0F 19 00 <.A> 09 00 <Engine.Actor.Location> 00 01 <Engine.Actor.Location>
23 <!XComSpawnPoint4>
//A.Rotation = vect(P, Y, R)
0F 19 00 <.A> 09 00 <Engine.Actor.Rotation> 00 01 <Engine.Actor.Rotation>
22 <%i 0> <%i 32064> <%i 0>

//FindActorByName('XComSpawnPoint_8', A)
1C <Engine.Actor.FindActorByName> 21 <XComSpawnPoint_8> 00 <.A> 16
//A.Location = vect(x, y, z)
0F 19 00 <.A> 09 00 <Engine.Actor.Location> 00 01 <Engine.Actor.Location>
23 <!XComSpawnPoint5>
//A.Rotation = vect(P, Y, R)
0F 19 00 <.A> 09 00 <Engine.Actor.Rotation> 00 01 <Engine.Actor.Rotation>
22 <%i 0> <%i 32064> <%i 0>

//FindActorByName('XComSpawnPoint_9', A)
1C <Engine.Actor.FindActorByName> 21 <XComSpawnPoint_9> 00 <.A> 16
//A.Location = vect(x, y, z)
0F 19 00 <.A> 09 00 <Engine.Actor.Location> 00 01 <Engine.Actor.Location>
23 <!XComSpawnPoint6>
//A.Rotation = vect(P, Y, R)
0F 19 00 <.A> 09 00 <Engine.Actor.Rotation> 00 01 <Engine.Actor.Rotation>
22 <%i 0> <%i 32064> <%i 0>

//if(Desc().ShouldSpawnMeldCanisters())
07 [@NoMeld] 19 1B <Desc> 16 0A 00 <XGBattleDesc.ShouldSpawnMeldCanisters.ReturnValue> 00 1B <ShouldSpawnMeldCanisters> 16

//InitMeldContainers()
1B <InitMeldContainers> 16

[#NoMeld]

//InitCapturePoints()
1B <InitCapturePoints> 16

//return
04 0B

//EOS
53

 

 

I'm testing with vanilla currently. Yes, this mod will apply both to vanilla and Long War games.

 

Moving LZ inside script IMO is better, as with 4 different streaming maps you might end up having the same map twice in a row, but with different LZ location. This won't be fun. Potentially, I could also save used LZ positions and choose a new position next time map selection rolls this map.

 

I'm going to expose all 10 objects in config file, because on some of the maps positions might need fine-tuning. And because it will make scripting easier for me. :smile:

 

Config array will look like this:

RandomLZArray = (MapName="URB_Bar", CouncilType=eFCMType_None, PlayerStartLocation=(X, Y, Z), PlayerStartRotation=(P, Y, R), ..., XComSpawnPoint6Location=(X, Y, Z), XComSpawnPoint6Rotation=(P, Y, R))
CouncilType will allow to set LZ for abductions and different types of Council missions separately.

 

Don't worry about misspelling, English is not my native language too. :smile:

Edited by wghost81
Link to comment
Share on other sites

LiQuiD911, you can change almost anything with scripting, but you need to find the right object to change first. :smile: So yes, please, continue your research. Your findings are a major breakthrough in map editing.

 

BTW, now I can see how maps are created in UDK. All those objects are collection of archetypes (objects, sounds, etc), organized in prefabs and placed on maps easily with editor. But after cooking is done, prefabs get useless, although they still persist as map objects (but not actually used), and we need to find and edit all the subobjects of one object manually to move or rotate it. For example, LZ object has 10 such subobjects, which have to be located individually for each map, as they have different names for different maps.

Edited by wghost81
Link to comment
Share on other sites

So, if we want to make new maps we need to reassemble the actors to make new prefabs, It would be a nightmare to go trough all the actors.. CB2_MP_Blank is nearly empty but is full of actors. An important limitation is volume editing... the map floor bounds are specified by static meshes.. we can edit their vertexes but can we insert new ones? If we can crack the actor thing then I suppose map upk become "tilesets" for making new maps.. flat ones without too many floors. Edit: oh and I forgot the nastiest part: particle emmitters, those will be a real pain to edit.

 

By the way, did you manage to hide the default LZ when streams are used?

Edited by LiQuiD911
Link to comment
Share on other sites

Preparing "clean" stream map:

http://forums.nexusmods.com/index.php?/topic/1104408-r-d-xcom-map-alterations/?p=18238944

 

Do this and then edit LZ location with this:

http://forums.nexusmods.com/index.php?/topic/1104408-r-d-xcom-map-alterations/?p=18249424

 

It will remove original LZ on the maps, which "accept" new streams. On other maps, like TrainStation, it won't.

Edited by wghost81
Link to comment
Share on other sites

I found the elements of a capture and hold stream

the small volume doesn't seem to effect anything, the big volumes have their highlight in them (and triggers too), no other actors needed. The enemy wave file is pretty straightforward. I'm moving to car prefabs.

 

 

 

Map Comercial Restaurant CNH

decoderBIG
TheWorld.PersistentLevel.XComCapturePointVolume_0
decoderSMALL
TheWorld.PersistentLevel.XComRebuildWorldDataVolume_9


trasmiterBiG
TheWorld.PersistentLevel.XComCapturePointVolume_1
TheWorld.PersistentLevel.XComRebuildWorldDataVolume_1


Extr volume
TheWorld.PersistentLevel.XComBuildingVolume_0

Extr highlight actor
TheWorld.PersistentLevel.XComLevelActor_0



encoder actor
TheWorld.PersistentLevel.XComCapturePointActor_14

trasmiter actor
TheWorld.PersistentLevel.XComCapturePointActor_15

array actors
TheWorld.PersistentLevel.XComRadarArrayActor_12
TheWorld.PersistentLevel.XComRadarArrayActor_13
TheWorld.PersistentLevel.XComRadarArrayActor_14
TheWorld.PersistentLevel.XComRadarArrayActor_15

 

 

Edited by LiQuiD911
Link to comment
Share on other sites

@ Ghost

 

So the new plan for basic LZ relocation is to leave off streaming files and instead use XComGame script + config settings, and number of config lines will determine number of alternate locations and limit map-repeating issue because they will all be counted as the same map.

 

Works for me.

Link to comment
Share on other sites

  • Recently Browsing   0 members

    • No registered users viewing this page.

×
×
  • Create New...