Jump to content

R&D Dynamic Pod Placement


wghost81

Recommended Posts

I've implemented Highway1 placement issues workaround and everything seems fine so far.

 

johnnylump, here's UE Explorer tokens view for LW:

 

 

 

(000/000) [0F 1A 2C 00 00 70 BA 00 00 36 35 42 00 00 00 43 00 00 00 00 00 01 38 BA 00 00]
	L(42/26) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> DAL(29/17) -> SM(28/16) -> IV(9/5)
	iPod[0] = m_kSquad.arrPods.Length

(02A/01A) [07 85 00 99 7E 19 12 20 35 FE FF FF 0A 00 92 F9 FF FF 00 1C D5 FB FF FF 16 0B 00 AD F8 FF FF 00 1C 30 FA FF FF 4A 16 1F 48 69 67 68 77 61 79 31 00 28 27 4A 16 25 16]
	JIN(75/55) -> NF(72/52) -> NF(69/49) -> C(54/34) -> CC(31/19) -> OC(9/5) -> FF(10/6) -> EFP(1/1) -> FF(11/7) -> NP(1/1) -> EFP(1/1) -> SC(10/10) -> F(1/1) -> T(1/1) -> NP(1/1) -> EFP(1/1) -> IZ(1/1) -> EFP(1/1)
	if(InStr(class'Engine'.static.GetCurrentWorldInfo().GetMapName(), "Highway1", false, true) >= 0)

(075/051) [A1 1A 2C 00 00 70 BA 00 00 2C 02 16]
	NF(16/12) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> ICB(2/2) -> EFP(1/1)
	iPod[0] += 2

(085/05D) [07 B9 00 96 1A 2C 00 00 70 BA 00 00 2C 05 16]
	JIN(19/15) -> NF(16/12) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> ICB(2/2) -> EFP(1/1)
	if(iPod[0] < 5)

(098/06C) [0F 1A 2C 01 00 70 BA 00 00 2C 03]
	L(15/11) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> ICB(2/2)
	iPod[1] = 3

(0A7/077) [0F 1A 2C 02 00 70 BA 00 00 2C 02]
	L(15/11) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> ICB(2/2)
	iPod[2] = 2

(0B6/082) [06 0B 01]
	J(3/3)
	goto J0x10B

(0B9/085) [07 ED 00 96 1A 2C 00 00 70 BA 00 00 2C 07 16]
	JIN(19/15) -> NF(16/12) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> ICB(2/2) -> EFP(1/1)
	if(iPod[0] < 7)

(0CC/094) [0F 1A 2C 01 00 70 BA 00 00 2C 03]
	L(15/11) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> ICB(2/2)
	iPod[1] = 3

(0DB/09F) [0F 1A 2C 02 00 70 BA 00 00 2C 03]
	L(15/11) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> ICB(2/2)
	iPod[2] = 3

(0EA/0AA) [06 0B 01]
	J(3/3)
	goto J0x10B

(0ED/0AD) [0F 1A 2C 01 00 70 BA 00 00 2C 04]
	L(15/11) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> ICB(2/2)
	iPod[1] = 4

(0FC/0B8) [0F 1A 2C 02 00 70 BA 00 00 2C 03]
	L(15/11) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> ICB(2/2)
	iPod[2] = 3

(10B/0C3) [0F 1A 2C 03 00 70 BA 00 00 19 1B A1 7F 00 00 00 00 00 00 16 09 00 30 0D 00 00 00 01 30 0D 00 00]
	L(44/32) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> C(31/23) -> VF(10/10) -> EFP(1/1) -> IV(9/5)
	iPod[3] = World().NumX

(137/0E3) [0F 1A 2C 04 00 70 BA 00 00 19 1B A1 7F 00 00 00 00 00 00 16 09 00 2F 0D 00 00 00 01 2F 0D 00 00]
	L(44/32) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> C(31/23) -> VF(10/10) -> EFP(1/1) -> IV(9/5)
	iPod[4] = World().NumY

(163/103) [0F 1A 2C 11 00 70 BA 00 00 19 1B A1 7F 00 00 00 00 00 00 16 09 00 2E 0D 00 00 00 01 2E 0D 00 00]
	L(44/32) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> C(31/23) -> VF(10/10) -> EFP(1/1) -> IV(9/5)
	iPod[17] = World().NumZ

(18F/123) [07 FD 01 97 1A 2C 03 00 70 BA 00 00 1A 2C 04 00 70 BA 00 00 16]
	JIN(29/21) -> NF(26/18) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> EFP(1/1)
	if(iPod[3] > iPod[4])

(1AC/138) [0F 1A 2C 05 00 70 BA 00 00 91 1A 2C 03 00 70 BA 00 00 1A 2C 01 00 70 BA 00 00 16]
	L(39/27) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> NF(26/18) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> EFP(1/1)
	iPod[5] = iPod[3] / iPod[1]

(1D3/153) [0F 1A 2C 06 00 70 BA 00 00 91 1A 2C 04 00 70 BA 00 00 1A 2C 02 00 70 BA 00 00 16]
	L(39/27) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> NF(26/18) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> EFP(1/1)
	iPod[6] = iPod[4] / iPod[2]

(1FA/16E) [06 4B 02]
	J(3/3)
	goto J0x24B

(1FD/171) [0F 1A 2C 05 00 70 BA 00 00 91 1A 2C 03 00 70 BA 00 00 1A 2C 02 00 70 BA 00 00 16]
	L(39/27) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> NF(26/18) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> EFP(1/1)
	iPod[5] = iPod[3] / iPod[2]

(224/18C) [0F 1A 2C 06 00 70 BA 00 00 91 1A 2C 04 00 70 BA 00 00 1A 2C 01 00 70 BA 00 00 16]
	L(39/27) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> NF(26/18) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> EFP(1/1)
	iPod[6] = iPod[4] / iPod[1]

(24B/1A7) [0F 1A 2C 07 00 70 BA 00 00 91 90 1A 2C 05 00 70 BA 00 00 2C 03 16 2C 04 16]
	L(33/25) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> NF(20/16) -> NF(16/12) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> ICB(2/2) -> EFP(1/1) -> ICB(2/2) -> EFP(1/1)
	iPod[7] = (iPod[5] * 3) / 4

(26C/1C0) [0F 1A 2C 08 00 70 BA 00 00 91 90 1A 2C 06 00 70 BA 00 00 2C 03 16 2C 04 16]
	L(33/25) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> NF(20/16) -> NF(16/12) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> ICB(2/2) -> EFP(1/1) -> ICB(2/2) -> EFP(1/1)
	iPod[8] = (iPod[6] * 3) / 4

(28D/1D9) [0F 1A 2C 09 00 70 BA 00 00 91 93 1A 2C 05 00 70 BA 00 00 1A 2C 07 00 70 BA 00 00 16 2C 02 16]
	L(43/31) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> NF(30/22) -> NF(26/18) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> EFP(1/1) -> ICB(2/2) -> EFP(1/1)
	iPod[9] = (iPod[5] - iPod[7]) / 2

(2B8/1F8) [07 43 06 96 1A 2C 09 00 70 BA 00 00 1A 2C 03 00 70 BA 00 00 16]
	JIN(29/21) -> NF(26/18) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> EFP(1/1)
	if(iPod[9] < iPod[3])

(2D5/20D) [0F 1A 2C 0A 00 70 BA 00 00 91 93 1A 2C 06 00 70 BA 00 00 1A 2C 08 00 70 BA 00 00 16 2C 02 16]
	L(43/31) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> NF(30/22) -> NF(26/18) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> EFP(1/1) -> ICB(2/2) -> EFP(1/1)
	iPod[10] = (iPod[6] - iPod[8]) / 2

(300/22C) [07 26 06 96 1A 2C 0A 00 70 BA 00 00 1A 2C 04 00 70 BA 00 00 16]
	JIN(29/21) -> NF(26/18) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> EFP(1/1)
	if(iPod[10] < iPod[4])

(31D/241) [0F 1A 2C 0B 00 70 BA 00 00 2C 00]
	L(15/11) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> ICB(2/2)
	iPod[11] = 0

(32C/24C) [07 95 05 96 1A 2C 0B 00 70 BA 00 00 2C 0A 16]
	JIN(19/15) -> NF(16/12) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> ICB(2/2) -> EFP(1/1)
	if(iPod[11] < 10)

(33F/25B) [A3 1A 2C 0B 00 70 BA 00 00 16]
	NF(14/10) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> EFP(1/1)
	++ iPod[11]

(34D/265) [0F 00 6F BA 00 00 19 1B A1 7F 00 00 00 00 00 00 16 73 00 AC D2 00 00 00 1B 29 33 00 00 00 00 00 00 19 1B A1 7F 00 00 00 00 00 00 16 50 00 BC 0C 00 00 00 1B DD 3A 00 00 00 00 00 00 92 1A 2C 09 00 70 BA 00 00 A7 1A 2C 07 00 70 BA 00 00 16 16 92 1A 2C 0A 00 70 BA 00 00 A7 1A 2C 08 00 70 BA 00 00 16 16 A7 1A 2C 11 00 70 BA 00 00 16 16 28 28 27 16]
	L(147/115) -> LV(9/5) -> C(137/109) -> VF(10/10) -> EFP(1/1) -> VF(115/91) -> C(102/78) -> VF(10/10) -> EFP(1/1) -> VF(80/60) -> NF(28/20) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> NF(14/10) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> EFP(1/1) -> EFP(1/1) -> NF(28/20) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> NF(14/10) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> EFP(1/1) -> EFP(1/1) -> NF(14/10) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> EFP(1/1) -> EFP(1/1) -> F(1/1) -> F(1/1) -> T(1/1) -> EFP(1/1)
	iTestPod = World().FindClosestValidLocation(World().GetPositionFromTileCoordinates(iPod[9] + Rand(iPod[7]), iPod[10] + Rand(iPod[8]), Rand(iPod[17])), false, false, true)

(3E0/2D8) [19 1B A1 7F 00 00 00 00 00 00 16 38 00 C4 0C 00 00 00 1B E8 38 00 00 00 00 00 00 00 6F BA 00 00 1A 2C 0E 00 70 BA 00 00 1A 2C 0F 00 70 BA 00 00 1A 2C 10 00 70 BA 00 00 27 16]
	C(78/58) -> VF(10/10) -> EFP(1/1) -> VF(56/40) -> LV(9/5) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> T(1/1) -> EFP(1/1)
	World().GetFloorTileForPosition(iTestPod, iPod[14], iPod[15], iPod[16], true)

(42E/312) [07 A4 04 99 7E 19 12 20 35 FE FF FF 0A 00 92 F9 FF FF 00 1C D5 FB FF FF 16 0B 00 AD F8 FF FF 00 1C 30 FA FF FF 4A 16 1F 48 69 67 68 77 61 79 31 00 28 27 4A 16 25 16]
	JIN(75/55) -> NF(72/52) -> NF(69/49) -> C(54/34) -> CC(31/19) -> OC(9/5) -> FF(10/6) -> EFP(1/1) -> FF(11/7) -> NP(1/1) -> EFP(1/1) -> SC(10/10) -> F(1/1) -> T(1/1) -> NP(1/1) -> EFP(1/1) -> IZ(1/1) -> EFP(1/1)
	if(InStr(class'Engine'.static.GetCurrentWorldInfo().GetMapName(), "Highway1", false, true) >= 0)

(479/349) [07 A4 04 82 96 1A 2C 0E 00 70 BA 00 00 2C 1A 16 18 11 00 96 1A 2C 0F 00 70 BA 00 00 2C 1D 16 16]
	JIN(40/32) -> NF(37/29) -> NF(16/12) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> ICB(2/2) -> EFP(1/1) -> S(19/15) -> NF(16/12) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> ICB(2/2) -> EFP(1/1) -> EFP(1/1)
	if((iPod[14] < 26) && iPod[15] < 29)

(4A1/369) [06 2C 03]
	J(3/3)
	goto J0x32C

(4A4/36C) [0F 00 6F BA 00 00 19 1B A1 7F 00 00 00 00 00 00 16 2E 00 BC 0C 00 00 00 1B DD 3A 00 00 00 00 00 00 1A 2C 0E 00 70 BA 00 00 1A 2C 0F 00 70 BA 00 00 1A 2C 10 00 70 BA 00 00 16]
	L(78/58) -> LV(9/5) -> C(68/52) -> VF(10/10) -> EFP(1/1) -> VF(46/34) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> EFP(1/1)
	iTestPod = World().GetPositionFromTileCoordinates(iPod[14], iPod[15], iPod[16])

(4F2/3A6) [07 15 05 B0 E4 D8 00 6F BA 00 00 01 32 BA 00 00 16 16 1E 00 00 61 4A 16]
	JIN(32/24) -> NF(29/21) -> NF(22/14) -> NF(20/12) -> LV(9/5) -> IV(9/5) -> EFP(1/1) -> EFP(1/1) -> FC(5/5) -> EFP(1/1)
	if(VSizeSq(iTestPod - m_vPlayerSpawn) < 3686400.0)

(512/3BE) [06 2C 03]
	J(3/3)
	goto J0x32C

(515/3C1) [07 86 05 77 2E 1F B4 00 00 1B 3C 08 00 00 00 00 00 00 16 2A 16]
	JIN(25/21) -> NF(22/18) -> CDC(19/15) -> VF(10/10) -> EFP(1/1) -> NO(1/1) -> EFP(1/1)
	if(XGBattle_SPCovertOpsExtraction(BATTLE()) != none)

(52E/3D6) [07 86 05 B0 E4 D8 00 6F BA 00 00 19 19 2E 1F B4 00 00 1B 3C 08 00 00 00 00 00 00 16 0A 00 FF B3 00 00 00 1C 00 B4 00 00 16 09 00 94 F8 FF FF 00 01 94 F8 FF FF 16 16 1E 00 00 61 4A 16]
	JIN(85/61) -> NF(82/58) -> NF(75/51) -> NF(73/49) -> LV(9/5) -> C(62/42) -> C(41/29) -> CDC(19/15) -> VF(10/10) -> EFP(1/1) -> FF(10/6) -> EFP(1/1) -> IV(9/5) -> EFP(1/1) -> EFP(1/1) -> FC(5/5) -> EFP(1/1)
	if(VSizeSq(iTestPod - XGBattle_SPCovertOpsExtraction(BATTLE()).ChooseCovertOperativeSpawnPoint().Location) < 3686400.0)

(583/413) [06 2C 03]
	J(3/3)
	goto J0x32C

(586/416) [0F 1A 2C 0B 00 70 BA 00 00 2C 00]
	L(15/11) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> ICB(2/2)
	iPod[11] = 0

(595/421) [07 09 06 9A 1A 2C 0B 00 70 BA 00 00 2C 00 16]
	JIN(19/15) -> NF(16/12) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> ICB(2/2) -> EFP(1/1)
	if(iPod[11] == 0)

(5A8/430) [0F 00 73 BA 00 00 1C 12 FC FF FF 20 32 42 00 00 4A 4A 00 6F BA 00 00 4A 4A 27 4A 16]
	L(44/28) -> LV(9/5) -> FF(34/22) -> OC(9/5) -> NP(1/1) -> NP(1/1) -> LV(9/5) -> NP(1/1) -> NP(1/1) -> T(1/1) -> NP(1/1) -> EFP(1/1)
	kPod = Spawn(class'XComAlienPod',,, iTestPod,,, true)

(5D4/44C) [19 00 73 BA 00 00 0A 00 00 00 00 00 00 1B 8D 41 00 00 00 00 00 00 16]
	C(31/23) -> LV(9/5) -> VF(10/10) -> EFP(1/1)
	kPod.Init()

(5F3/463) [55 00 72 BA 00 00 0A 00 00 73 BA 00 00 16]
	DAAI(22/14) -> LV(9/5) -> LV(9/5) -> EFP(1/1)
	arrPods.AddItem(kPod)

(609/471) [A1 1A 2C 0A 00 70 BA 00 00 1A 2C 06 00 70 BA 00 00 16]
	NF(26/18) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> EFP(1/1)
	iPod[10] += iPod[6]

(623/483) [06 00 03]
	J(3/3)
	goto J0x300

(626/486) [A1 1A 2C 09 00 70 BA 00 00 1A 2C 05 00 70 BA 00 00 16]
	NF(26/18) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> EFP(1/1)
	iPod[9] += iPod[5]

(640/498) [06 B8 02]
	J(3/3)
	goto J0x2B8

(643/49B) [07 CF 06 84 84 9A 19 1B 3F 08 00 00 00 00 00 00 16 09 00 B2 B4 00 00 00 01 B2 B4 00 00 2C 08 16 18 24 00 9A 19 1B 3F 08 00 00 00 00 00 00 16 09 00 B2 B4 00 00 00 01 B2 B4 00 00 2C 0A 16 16 18 28 00 9A 38 3A 19 1B 3F 08 00 00 00 00 00 00 16 09 00 AF B4 00 00 00 01 AF B4 00 00 38 3A 24 09 16 16]
	JIN(122/98) -> NF(119/95) -> NF(75/59) -> NF(35/27) -> C(31/23) -> VF(10/10) -> EFP(1/1) -> IV(9/5) -> ICB(2/2) -> EFP(1/1) -> S(38/30) -> NF(35/27) -> C(31/23) -> VF(10/10) -> EFP(1/1) -> IV(9/5) -> ICB(2/2) -> EFP(1/1) -> EFP(1/1) -> S(42/34) -> NF(39/31) -> CBTI(33/24) -> C(31/23) -> VF(10/10) -> EFP(1/1) -> IV(9/5) -> CBTI(4/3) -> BC(2/2) -> EFP(1/1) -> EFP(1/1)
	if(((BattleDesc().m_iMissionType == 8) || BattleDesc().m_iMissionType == 10) || BattleDesc().m_eUFOType == 9)

(6BD/4FD) [0F 1A 2C 0C 00 70 BA 00 00 2C 00]
	L(15/11) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> ICB(2/2)
	iPod[12] = 0

(6CC/508) [06 F5 09]
	J(3/3)
	goto J0x9F5

(6CF/50B) [07 E6 09 84 9A 19 1B 3F 08 00 00 00 00 00 00 16 09 00 B2 B4 00 00 00 01 B2 B4 00 00 2C 03 16 18 24 00 9A 19 1B 3F 08 00 00 00 00 00 00 16 09 00 B2 B4 00 00 00 01 B2 B4 00 00 2C 04 16 16]
	JIN(78/62) -> NF(75/59) -> NF(35/27) -> C(31/23) -> VF(10/10) -> EFP(1/1) -> IV(9/5) -> ICB(2/2) -> EFP(1/1) -> S(38/30) -> NF(35/27) -> C(31/23) -> VF(10/10) -> EFP(1/1) -> IV(9/5) -> ICB(2/2) -> EFP(1/1) -> EFP(1/1)
	if((BattleDesc().m_iMissionType == 3) || BattleDesc().m_iMissionType == 4)

(71D/549) [0F 1A 2C 0D 00 70 BA 00 00 19 19 1B 25 63 00 00 00 00 00 00 16 09 00 16 BF 00 00 00 01 16 BF 00 00 0A 00 AB BC 00 00 00 1B F2 3B 00 00 00 00 00 00 16]
	L(66/50) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> C(53/41) -> C(31/23) -> VF(10/10) -> EFP(1/1) -> IV(9/5) -> VF(10/10) -> EFP(1/1)
	iPod[13] = OVERMIND().m_kLayout.GetUFOVolumeIndex()

(75F/57B) [0F 00 71 BA 00 00 35 90 AF 00 00 91 AF 00 00 00 00 19 19 1B 25 63 00 00 00 00 00 00 16 09 00 16 BF 00 00 00 01 16 BF 00 00 16 00 AE BC 00 00 00 1B CA 37 00 00 00 00 00 00 1A 2C 0D 00 70 BA 00 00 16]
	L(94/66) -> LV(9/5) -> SM(84/60) -> C(65/49) -> C(31/23) -> VF(10/10) -> EFP(1/1) -> IV(9/5) -> VF(22/18) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> EFP(1/1)
	arrRemove = OVERMIND().m_kLayout.GetBuildingByIndex(iPod[13]).rectBuilding

(7BD/5BD) [0F 00 71 BA 00 00 1B 14 6B 00 00 00 00 00 00 00 71 BA 00 00 1E 00 00 40 3F 16]
	L(34/26) -> LV(9/5) -> VF(24/20) -> LV(9/5) -> FC(5/5) -> EFP(1/1)
	arrRemove = ScaleRect(arrRemove, 0.750)

(7DF/5D7) [0F 35 0C FD FF FF 16 F9 FF FF 00 00 00 6F BA 00 00 AE 35 00 FD FF FF 0F F9 FF FF 00 01 00 71 BA 00 00 AB C3 16 1B 56 68 00 00 00 00 00 00 00 71 BA 00 00 16 16 16]
	L(82/54) -> SM(28/16) -> LV(9/5) -> NF(53/37) -> SM(28/16) -> LV(9/5) -> NF(23/19) -> NF(2/2) -> EFP(1/1) -> VF(19/15) -> LV(9/5) -> EFP(1/1) -> EFP(1/1) -> EFP(1/1)
	iTestPod.X = arrRemove.fLeft + (FRand() * (RectWidth(arrRemove)))

(831/60D) [0F 35 0B FD FF FF 16 F9 FF FF 00 00 00 6F BA 00 00 AE 35 FE FC FF FF 0F F9 FF FF 00 01 00 71 BA 00 00 AB C3 16 1B 50 68 00 00 00 00 00 00 00 71 BA 00 00 16 16 16]
	L(82/54) -> SM(28/16) -> LV(9/5) -> NF(53/37) -> SM(28/16) -> LV(9/5) -> NF(23/19) -> NF(2/2) -> EFP(1/1) -> VF(19/15) -> LV(9/5) -> EFP(1/1) -> EFP(1/1) -> EFP(1/1)
	iTestPod.Y = arrRemove.fTop + (FRand() * (RectHeight(arrRemove)))

(883/643) [0F 35 0A FD FF FF 16 F9 FF FF 00 00 00 6F BA 00 00 25]
	L(30/18) -> SM(28/16) -> LV(9/5) -> IZ(1/1)
	iTestPod.Z = 0

(8A1/655) [0F 00 6F BA 00 00 19 1B A1 7F 00 00 00 00 00 00 16 20 00 AC D2 00 00 00 1B 29 33 00 00 00 00 00 00 00 6F BA 00 00 28 28 27 16]
	L(54/42) -> LV(9/5) -> C(44/36) -> VF(10/10) -> EFP(1/1) -> VF(22/18) -> LV(9/5) -> F(1/1) -> F(1/1) -> T(1/1) -> EFP(1/1)
	iTestPod = World().FindClosestValidLocation(iTestPod, false, false, true)

(8D7/67F) [19 1B A1 7F 00 00 00 00 00 00 16 38 00 C4 0C 00 00 00 1B E8 38 00 00 00 00 00 00 00 6F BA 00 00 1A 2C 0E 00 70 BA 00 00 1A 2C 0F 00 70 BA 00 00 1A 2C 10 00 70 BA 00 00 27 16]
	C(78/58) -> VF(10/10) -> EFP(1/1) -> VF(56/40) -> LV(9/5) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> T(1/1) -> EFP(1/1)
	World().GetFloorTileForPosition(iTestPod, iPod[14], iPod[15], iPod[16], true)

(925/6B9) [0F 00 6F BA 00 00 19 1B A1 7F 00 00 00 00 00 00 16 2E 00 BC 0C 00 00 00 1B DD 3A 00 00 00 00 00 00 1A 2C 0E 00 70 BA 00 00 1A 2C 0F 00 70 BA 00 00 1A 2C 10 00 70 BA 00 00 16]
	L(78/58) -> LV(9/5) -> C(68/52) -> VF(10/10) -> EFP(1/1) -> VF(46/34) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> EFP(1/1)
	iTestPod = World().GetPositionFromTileCoordinates(iPod[14], iPod[15], iPod[16])

(973/6F3) [0F 00 73 BA 00 00 1C 12 FC FF FF 20 32 42 00 00 4A 4A 00 6F BA 00 00 4A 4A 27 4A 16]
	L(44/28) -> LV(9/5) -> FF(34/22) -> OC(9/5) -> NP(1/1) -> NP(1/1) -> LV(9/5) -> NP(1/1) -> NP(1/1) -> T(1/1) -> NP(1/1) -> EFP(1/1)
	kPod = Spawn(class'XComAlienPod',,, iTestPod,,, true)

(99F/70F) [19 00 73 BA 00 00 0A 00 00 00 00 00 00 1B 8D 41 00 00 00 00 00 00 16]
	C(31/23) -> LV(9/5) -> VF(10/10) -> EFP(1/1)
	kPod.Init()

(9BE/726) [55 00 72 BA 00 00 0A 00 00 73 BA 00 00 16]
	DAAI(22/14) -> LV(9/5) -> LV(9/5) -> EFP(1/1)
	arrPods.AddItem(kPod)

(9D4/734) [0F 1A 2C 0C 00 70 BA 00 00 2C 01]
	L(15/11) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> ICB(2/2)
	iPod[12] = 1

(9E3/73F) [06 F5 09]
	J(3/3)
	goto J0x9F5

(9E6/742) [0F 1A 2C 0C 00 70 BA 00 00 2C 01]
	L(15/11) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> ICB(2/2)
	iPod[12] = 1

(9F5/74D) [07 7F 0A 9A 1A 2C 0C 00 70 BA 00 00 2C 00 16]
	JIN(19/15) -> NF(16/12) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> ICB(2/2) -> EFP(1/1)
	if(iPod[12] == 0)

(A08/75C) [2F 19 01 A6 F9 FF FF 5A 00 00 00 00 00 00 61 30 20 32 42 00 00 00 73 BA 00 00 4A 16 7E 0A]
	I(46/30) -> C(43/27) -> IV(9/5) -> NF(22/13) -> OC(9/5) -> LV(9/5) -> NP(1/1) -> EFP(1/1)
	foreach WorldInfo.AllActors(class'XComAlienPod', kPod)

(A36/77A) [07 7D 0A 19 00 73 BA 00 00 0A 00 EC 3F 00 00 00 2D 01 EC 3F 00 00]
	JIN(34/22) -> C(31/19) -> LV(9/5) -> BV(10/6) -> IV(9/5)
	if(kPod.bCommanderPod)

(A58/790) [55 00 72 BA 00 00 0A 00 00 73 BA 00 00 16]
	DAAI(22/14) -> LV(9/5) -> LV(9/5) -> EFP(1/1)
	arrPods.AddItem(kPod)

(A6E/79E) [0F 1A 2C 0C 00 70 BA 00 00 2C 01]
	L(15/11) -> AE(12/8) -> ICB(2/2) -> LV(9/5) -> ICB(2/2)
	iPod[12] = 1

(A7D/7A9) [31]
	IN(1/1)
	
(A7E/7AA) [30]
	IP(1/1)
	
(A7F/7AB) [0F 01 36 BA 00 00 00 72 BA 00 00]
	L(19/11) -> IV(9/5) -> LV(9/5)
	m_arrPossibleSpawns = arrPods

(A92/7B6) [0F 01 35 BA 00 00 01 36 BA 00 00]
	L(19/11) -> IV(9/5) -> IV(9/5)
	m_arrOriginalSpawns = m_arrPossibleSpawns

(AA5/7C1) [04 0B]
	R(2/2) -> N(1/1)
	return

(AA7/7C3) [53]
	EOS(1/1)

 

Edited by wghost81
Link to comment
Share on other sites

  • Replies 60
  • Created
  • Last Reply

Top Posters In This Topic

WGhost, Thanks! One more off the buglist.

 

I am implementing the random dropdown code in upk modder and realized I don't really know what this means or how to implement it. It appears necessary, as the drops without are landing at odd zs.


OBJECT=SeqAct_SpawnAlien.Activated:AUTO

ALIAS=numX:19 00 <.ThisObj> 09 00 <XComWorldData.NumX> 00 01 <XComWorldData.NumX>
ALIAS=numY:19 00 <.ThisObj> 09 00 <XComWorldData.NumY> 00 01 <XComWorldData.NumY>
ALIAS=numZ:19 00 <.ThisObj> 09 00 <XComWorldData.NumZ> 00 01 <XComWorldData.NumZ>

Apologies, but any guidance there would be appreciated.

EDIT: Oh, wait, I see Amineri did something like this in another function. I'll try to imitate the code and will report back.

 

EDIT 2: No joy. I added these exact lines imitating how A did it in GetPossibleSpawns, but I'm getting I'm testing on the first Slingshot map (via ForceSlingshotMission), and many of the Thin Men appear to drop down at random locations, with their "landing" animation firing at ground level at, but then their z is immediately increased and they end up floating several levels above ground. I'm not sure if I screwed up implementation somehow with the above, somewhere else, or this is an issue with the code. ANy advice would be appreciated.

Edited by johnnylump
Link to comment
Share on other sites

It's just a PatchUPK macro: all numX occurrences in the pseudo-code get replaced by 19 00 <.ThisObj> 09 00 <XComWorldData.NumX> 00 01 <XComWorldData.NumX>.

 

I think applying UE Explorer tokens as AFTER hex should do. It's taken from EW patch3 upk.

 

FindClosestValidLocation params are set to prioritize Z-level. They drop correctly on the roof on regular missions, but I haven't tested DLC missions yet. Check your FindClosestValidLocation params and I will check DLC.

Link to comment
Share on other sites

 

 

It's just a PatchUPK macro: all numX occurrences in the pseudo-code get replaced by 19 00 <.ThisObj> 09 00 <XComWorldData.NumX> 00 01 <XComWorldData.NumX>.

 

Okay, must just be Amineri's notes then in that one file.

 

I didn't edit your code at all, and it looks right. I tested on a bomb mission and they seemed to drop on the highest Z, so I suspect a DLC issue.

Link to comment
Share on other sites

I found a problem.

 

Here's the working code:

 

event Activated()
{
    local Vector SpawnObj;
    local XComWorldData ThisObj;
    local XComSpawnPoint_Alien SpawnPt;

    // End:0x11
    if(!bEnabled)
    {
        return;
    }
    ThisObj = class'XComWorldData'.static.GetWorldData();
    SpawnedUnit = none;
    OutputLinks[1].bHasImpulse = false;
    m_kDropIn = new class'XGAISpawnMethod_DropIn';
    m_kDropIn.InitDropIn(iDropHeight, bUseOverwatch, bTriggerOverwatch, bPlaySound, bRevealSpawn, bSpawnImmediately, ForceAlienType, kAdditionalSound, self);
    SpawnObj = ThisObj.FindClosestValidLocation(ThisObj.GetPositionFromTileCoordinates(Rand(ThisObj.NumX), Rand(ThisObj.NumY), ThisObj.NumZ - 1), false, true, false);
    // End:0x271
    if(!ThisObj.IsPositionOnFloor(SpawnObj))
    {
        SpawnObj = ThisObj.FindClosestValidLocation(ThisObj.GetPositionFromTileCoordinates(Rand(ThisObj.NumX), Rand(ThisObj.NumY), ThisObj.NumZ - 1), false, false, false);
    }
    SpawnPt = Spawn(class'XComSpawnPoint_Alien',,, SpawnObj,,, true);
    m_kDropIn.AddSpawnPoint(SpawnPt);
    // End:0x2F2
    if(bSpawnImmediately)
    {
        m_kDropIn.CheckContentLoaded();
    }
    OutputLinks[0].bHasImpulse = true;
    ActivateOutputLink(0);
    //return;    
}

 

 

Tokens:

 

(000/000) [07 11 00 81 2D 01 D5 0E 00 00 16]
	JIN(15/11) -> NF(12/8) -> BV(10/6) -> IV(9/5) -> EFP(1/1)
	if(!bEnabled)

(00F/00B) [04 0B]
	R(2/2) -> N(1/1)
	return

(011/00D) [0F 00 D8 0E 00 00 12 20 2A 0C 00 00 0A 00 C8 D2 00 00 00 1B 47 3C 00 00 00 00 00 00 16]
	L(41/29) -> LV(9/5) -> CC(31/23) -> OC(9/5) -> VF(10/10) -> EFP(1/1)
	ThisObj = class'XComWorldData'.static.GetWorldData()

(03A/02A) [0F 01 CD 0E 00 00 2A]
	L(11/7) -> IV(9/5) -> NO(1/1)
	SpawnedUnit = none

(045/031) [14 2D 35 DD FE FF FF F0 F8 FF FF 00 01 10 26 01 D9 FF FF FF 28]
	LB(33/21) -> BV(31/19) -> SM(30/18) -> DAE(11/7) -> IO(1/1) -> IV(9/5) -> F(1/1)
	OutputLinks[1].bHasImpulse = false

(066/046) [0F 01 CC 0E 00 00 11 0B 0B 0B 20 53 B0 00 00 0B]
	L(24/16) -> IV(9/5) -> N(14/10) -> N(1/1) -> N(1/1) -> N(1/1) -> OC(9/5) -> N(1/1)
	m_kDropIn = new class'XGAISpawnMethod_DropIn'

(07E/056) [19 01 CC 0E 00 00 59 00 00 00 00 00 00 1B B8 41 00 00 00 00 00 00 01 CF 0E 00 00 2D 01 D4 0E 00 00 2D 01 D3 0E 00 00 2D 01 D2 0E 00 00 2D 01 D1 0E 00 00 2D 01 D0 0E 00 00 01 D6 0E 00 00 01 CE 0E 00 00 17 4A 16]
	C(110/70) -> IV(9/5) -> VF(89/57) -> IV(9/5) -> BV(10/6) -> IV(9/5) -> BV(10/6) -> IV(9/5) -> BV(10/6) -> IV(9/5) -> BV(10/6) -> IV(9/5) -> BV(10/6) -> IV(9/5) -> IV(9/5) -> IV(9/5) -> S(1/1) -> NP(1/1) -> EFP(1/1)
	m_kDropIn.InitDropIn(iDropHeight, bUseOverwatch, bTriggerOverwatch, bPlaySound, bRevealSpawn, bSpawnImmediately, ForceAlienType, kAdditionalSound, self)

(0EC/09C) [0F 00 D9 0E 00 00 19 00 D8 0E 00 00 8D 00 AC D2 00 00 00 1B 29 33 00 00 00 00 00 00 19 00 D8 0E 00 00 6B 00 BC 0C 00 00 00 1B DD 3A 00 00 00 00 00 00 A7 19 00 D8 0E 00 00 09 00 30 0D 00 00 00 01 30 0D 00 00 16 A7 19 00 D8 0E 00 00 09 00 2F 0D 00 00 00 01 2F 0D 00 00 16 93 19 00 D8 0E 00 00 09 00 2E 0D 00 00 00 01 2E 0D 00 00 26 16 16 28 27 28 16]
	L(172/116) -> LV(9/5) -> C(162/110) -> LV(9/5) -> VF(141/97) -> C(128/84) -> LV(9/5) -> VF(107/71) -> NF(32/20) -> C(30/18) -> LV(9/5) -> IV(9/5) -> EFP(1/1) -> NF(32/20) -> C(30/18) -> LV(9/5) -> IV(9/5) -> EFP(1/1) -> NF(33/21) -> C(30/18) -> LV(9/5) -> IV(9/5) -> IO(1/1) -> EFP(1/1) -> EFP(1/1) -> F(1/1) -> T(1/1) -> F(1/1) -> EFP(1/1)
	SpawnObj = ThisObj.FindClosestValidLocation(ThisObj.GetPositionFromTileCoordinates(Rand(ThisObj.NumX), Rand(ThisObj.NumY), ThisObj.NumZ - 1), false, true, false)

(198/110) [07 71 02 81 19 00 D8 0E 00 00 6B 00 D5 0C 00 00 00 1B DF 45 00 00 00 00 00 00 00 D9 0E 00 00 16 16]
	JIN(45/33) -> NF(42/30) -> C(40/28) -> LV(9/5) -> VF(19/15) -> LV(9/5) -> EFP(1/1) -> EFP(1/1)
	if(!ThisObj.IsPositionOnFloor(SpawnObj))

(1C5/131) [0F 00 D9 0E 00 00 19 00 D8 0E 00 00 8D 00 AC D2 00 00 00 1B 29 33 00 00 00 00 00 00 19 00 D8 0E 00 00 6B 00 BC 0C 00 00 00 1B DD 3A 00 00 00 00 00 00 A7 19 00 D8 0E 00 00 09 00 30 0D 00 00 00 01 30 0D 00 00 16 A7 19 00 D8 0E 00 00 09 00 2F 0D 00 00 00 01 2F 0D 00 00 16 93 19 00 D8 0E 00 00 09 00 2E 0D 00 00 00 01 2E 0D 00 00 26 16 16 28 28 28 16]
	L(172/116) -> LV(9/5) -> C(162/110) -> LV(9/5) -> VF(141/97) -> C(128/84) -> LV(9/5) -> VF(107/71) -> NF(32/20) -> C(30/18) -> LV(9/5) -> IV(9/5) -> EFP(1/1) -> NF(32/20) -> C(30/18) -> LV(9/5) -> IV(9/5) -> EFP(1/1) -> NF(33/21) -> C(30/18) -> LV(9/5) -> IV(9/5) -> IO(1/1) -> EFP(1/1) -> EFP(1/1) -> F(1/1) -> F(1/1) -> F(1/1) -> EFP(1/1)
	SpawnObj = ThisObj.FindClosestValidLocation(ThisObj.GetPositionFromTileCoordinates(Rand(ThisObj.NumX), Rand(ThisObj.NumY), ThisObj.NumZ - 1), false, false, false)

(271/1A5) [0F 00 D7 0E 00 00 1C 12 FC FF FF 20 17 79 00 00 4A 4A 00 D9 0E 00 00 4A 4A 27 4A 16]
	L(44/28) -> LV(9/5) -> FF(34/22) -> OC(9/5) -> NP(1/1) -> NP(1/1) -> LV(9/5) -> NP(1/1) -> NP(1/1) -> T(1/1) -> NP(1/1) -> EFP(1/1)
	SpawnPt = Spawn(class'XComSpawnPoint_Alien',,, SpawnObj,,, true)

(29D/1C1) [19 01 CC 0E 00 00 14 00 00 00 00 00 00 1B AE 02 00 00 00 00 00 00 00 D7 0E 00 00 4A 16]
	C(41/29) -> IV(9/5) -> VF(20/16) -> LV(9/5) -> NP(1/1) -> EFP(1/1)
	m_kDropIn.AddSpawnPoint(SpawnPt)

(2C6/1DE) [07 F2 02 2D 01 D0 0E 00 00]
	JIN(13/9) -> BV(10/6) -> IV(9/5)
	if(bSpawnImmediately)

(2D3/1E7) [19 01 CC 0E 00 00 0A 00 00 00 00 00 00 1B 59 12 00 00 00 00 00 00 16]
	C(31/23) -> IV(9/5) -> VF(10/10) -> EFP(1/1)
	m_kDropIn.CheckContentLoaded()

(2F2/1FE) [14 2D 35 DD FE FF FF F0 F8 FF FF 00 01 10 25 01 D9 FF FF FF 27]
	LB(33/21) -> BV(31/19) -> SM(30/18) -> DAE(11/7) -> IZ(1/1) -> IV(9/5) -> T(1/1)
	OutputLinks[0].bHasImpulse = true

(313/213) [1C 7A FA FF FF 25 16]
	FF(11/7) -> IZ(1/1) -> EFP(1/1)
	ActivateOutputLink(0)

(31E/21A) [04 0B]
	R(2/2) -> N(1/1)
	return

(320/21C) [53]
	EOS(1/1)

 

 

PatchUPK/PatcherGUI:

 

UPK_FILE=XComGame.upk

//change ThisObj local var type to XComWorldData
OBJECT=SeqAct_SpawnAlien.Activated.ThisObj
REL_OFFSET=40
OBJIDX=XComWorldData

//convert SpawnObj local var to vector
EXPORT_ENTRY=SeqAct_SpawnAlien.Activated.SpawnObj
OBJIDX=Core.StructProperty
OBJECT=SeqAct_SpawnAlien.Activated.SpawnObj
REL_OFFSET=40
OBJIDX=Core.Object.Vector


OBJECT=SeqAct_SpawnAlien.Activated:AUTO

ALIAS=numX:19 00 <.ThisObj> 09 00 <XComWorldData.NumX> 00 01 <XComWorldData.NumX>
ALIAS=numY:19 00 <.ThisObj> 09 00 <XComWorldData.NumY> 00 01 <XComWorldData.NumY>
ALIAS=numZ:19 00 <.ThisObj> 09 00 <XComWorldData.NumZ> 00 01 <XComWorldData.NumZ>

[REPLACEMENT_CODE]
//if(!bEnabled)
07 [@NotEnabled] 81 2D 01 <@bEnabled> 16

	//return
	04 0B
	
[#NotEnabled]

//get XComWorldData object
//ThisObj = class'XComWorldData'.static.GetWorldData()
0F 00 <.ThisObj> 12 20 <Class.XComWorldData> 0A 00 <XComWorldData.GetWorldData.ReturnValue> 00 1B <GetWorldData> 16

//SpawnedUnit = none
0F 01 <@SpawnedUnit> 2A

//OutputLinks[1].bHasImpulse = false
14 2D 35 <Engine.SequenceOp.SeqOpOutputLink.bHasImpulse> <Engine.SequenceOp.SeqOpOutputLink> 00 01 10 26 01 <Engine.SequenceOp.OutputLinks> 28

//m_kDropIn = new class'XGAISpawnMethod_DropIn'
0F 01 <@m_kDropIn> 11 0B 0B 0B 20 <Class.XGAISpawnMethod_DropIn> 0B

//m_kDropIn.InitDropIn(iDropHeight, bUseOverwatch, bTriggerOverwatch, bPlaySound, bRevealSpawn, bSpawnImmediately, ForceAlienType, kAdditionalSound, self)
19 01 <@m_kDropIn> 59 00 <NullRef> 00 1B <InitDropIn> 01 <@iDropHeight> 2D 01 <@bUseOverwatch> 2D 01 <@bTriggerOverwatch> 2D 01 <@bPlaySound> 2D 01 <@bRevealSpawn> 2D 01 <@bSpawnImmediately> 01 <@ForceAlienType> 01 <@kAdditionalSound> 17 4A 16

//foreach LinkedVariables(class'SeqVar_Object', SpawnObj, "SpawnPoints")
//2F 1C 75 FA FF FF 20 9D FD FF FF 00 D9 0E 00 00 1F 53 70 61 77 6E 50 6F 69 6E 74 73 00 16 76 01
	//ThisObj = Actor(SpawnObj.GetObjectValue())
	//0F 00 D8 0E 00 00 2E 6E FE FF FF 19 00 D9 0E 00 00 0A 00 65 F9 FF FF 00 1B 6F 3A 00 00 00 00 00 00 16
	//SpawnPt = XComSpawnPoint_Alien(ThisObj)
	//0F 00 D7 0E 00 00 2E 17 79 00 00 00 D8 0E 00 00
	//if(SpawnPt != none)
	//07 75 01 77 00 D7 0E 00 00 2A 16
		//m_kDropIn.AddSpawnPoint(SpawnPt)
		//19 01 CC 0E 00 00 14 00 00 00 00 00 00 1B AE 02 00 00 00 00 00 00 00 D7 0E 00 00 4A 16
	//IN
	//31
	//IP
	//30
	
//SpawnObj = ThisObj.FindClosestValidLocation(ThisObj.GetPositionFromTileCoordinates(Rand(numX), Rand(numY), numZ - 1), false, true, false);
0F 00 <.SpawnObj>
19
00 <.ThisObj> <%s141> <XComWorldData.FindClosestValidLocation.ReturnValue> 00 1B <FindClosestValidLocation>
    19
    00 <.ThisObj> <%s107> <XComWorldData.GetPositionFromTileCoordinates.ReturnValue> 00 1B <GetPositionFromTileCoordinates>
        A7 <!numX> 16
        A7 <!numY> 16
        93 <!numZ> 26 16
    16
    28 27 28
16

//if(!ThisObj.IsPositionOnFloor(SpawnObj))
07 [@FloorCheck] 81
    19
    00 <.ThisObj> <%s107> <XComWorldData.IsPositionOnFloor.ReturnValue> 00 1B <IsPositionOnFloor>
        00 <.SpawnObj>
    16
16

//SpawnObj = ThisObj.FindClosestValidLocation(ThisObj.GetPositionFromTileCoordinates(Rand(numX), Rand(numY), numZ - 1), false, false, false);
0F 00 <.SpawnObj>
19
00 <.ThisObj> <%s141> <XComWorldData.FindClosestValidLocation.ReturnValue> 00 1B <FindClosestValidLocation>
    19
    00 <.ThisObj> <%s19> <XComWorldData.GetPositionFromTileCoordinates.ReturnValue> 00 1B <GetPositionFromTileCoordinates>
        A7 <!numX> 16
        A7 <!numY> 16
        93 <!numZ> 26 16
    16
    28 28 28
16

[#FloorCheck]

//SpawnPt = Spawn(class'XComSpawnPoint_Alien',,,SpawnObj,,, true)
0F 00 <.SpawnPt> 1C <Engine.Actor.Spawn> 20 <Class.XComSpawnPoint_Alien> 4A 4A 00 <.SpawnObj> 4A 4A 27 4A 16

//m_kDropIn.AddSpawnPoint(SpawnPt)
19 01 <@m_kDropIn> 14 00 <NullRef> 00 1B <AddSpawnPoint> 00 <.SpawnPt> 4A 16

//if(bSpawnImmediately)
07 [@NotImmediately] 2D 01 <@bSpawnImmediately>

	//m_kDropIn.CheckContentLoaded()
	19 01 <@m_kDropIn> 0A 00 <NullRef> 00 1B <CheckContentLoaded> 16

[#NotImmediately]

//OutputLinks[0].bHasImpulse = true
14 2D 35 <Engine.SequenceOp.SeqOpOutputLink.bHasImpulse> <Engine.SequenceOp.SeqOpOutputLink> 00 01 10 25 01 <Engine.SequenceOp.OutputLinks> 27

//ActivateOutputLink(0)
1C <Engine.SequenceOp.ActivateOutputLink> 25 16

//return
04 0B

//EOS
53

 

 

I'm beginning to understand how FindClosestValidLocation native function really works. If bPrioritizeZLevel is true, function actually tries to find closest elevated position! That's why ThinMen were always dropping on the roof in regular Council missions while I was testing the mod: there are plenty of roofs on those maps. But there are little to none roofs on Slingshot missions, so FindClosestValidLocation failed and for whatever reason left Z level value set to max value. So I've added this check to the code:

    if(!ThisObj.IsPositionOnFloor(SpawnObj))
    {
        SpawnObj = ThisObj.FindClosestValidLocation(ThisObj.GetPositionFromTileCoordinates(Rand(ThisObj.NumX), Rand(ThisObj.NumY), ThisObj.NumZ - 1), false, false, false);
    }
Now, if position is not on the floor, script calls for FindClosestValidLocation with bPrioritizeZLevel equal to false.

 

I've tested it in regular Council missions and in Slingshot missions: seems to work fine.

Link to comment
Share on other sites

Looks like that did the trick, thanks!

 

 

 

I'm beginning to understand how FindClosestValidLocation native function really works. If bPrioritizeZLevel is true, function actually tries to find closest elevated position!

 

Interesting. This one was giving me trouble as I was trying to fix the cyberdisc AI for using death blossom. I think I'll turn it to false adn see if they get more aggressive with it.

Link to comment
Share on other sites

Fantastic work as always, wghost - I feel a bit out of place commenting without being on the same technical level as you guys but it's fascinating stuff to read through and the results look great. Looking forward to having random canisters and drop-ins when everything's polished; it'd really be the last step to spice up those council missions completely.

 

Thanks for your efforts!

Link to comment
Share on other sites

Beaglerush, thanks! :smile: And if you have any ideas on spawn location restrictions, like always drop aliens near VIP, don't place Meld canisters in opposite map corners, etc, those are always welcomed! :smile:

 

XMarksTheSpot, so, as experiment shows, on the maps with plenty of roofs ThinMen will drop on the roof in about 90% of all cases. Turns out, it was easier to script, than I expected. :smile: Unfortunately, DLC drop-in animations are hardcoded inside DLC map files. But if we'll create some sort of Kismet script editor in the future, it might be possible to alter such things. :smile:

Link to comment
Share on other sites

  • Recently Browsing   0 members

    • No registered users viewing this page.

×
×
  • Create New...