wghost81 Posted August 23, 2014 Author Share Posted August 23, 2014 (edited) 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 August 23, 2014 by wghost81 Link to comment Share on other sites More sharing options...
johnnylump Posted August 23, 2014 Share Posted August 23, 2014 (edited) 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 August 23, 2014 by johnnylump Link to comment Share on other sites More sharing options...
wghost81 Posted August 23, 2014 Author Share Posted August 23, 2014 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 More sharing options...
johnnylump Posted August 23, 2014 Share Posted August 23, 2014 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 More sharing options...
wghost81 Posted August 23, 2014 Author Share Posted August 23, 2014 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 More sharing options...
johnnylump Posted August 23, 2014 Share Posted August 23, 2014 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 More sharing options...
Beaglerush Posted August 24, 2014 Share Posted August 24, 2014 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 More sharing options...
wghost81 Posted August 24, 2014 Author Share Posted August 24, 2014 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 More sharing options...
johnnylump Posted August 28, 2014 Share Posted August 28, 2014 Any idea if the random drop spawns affect xcom hq assault? Link to comment Share on other sites More sharing options...
wghost81 Posted August 28, 2014 Author Share Posted August 28, 2014 johnnylump, it shouldn't affect XCOM HQ nor EXALT missions, as those use XComWaveSystem to deploy enemy reinforcements. But I'm not 100% sure, as I haven't yet tested it. Link to comment Share on other sites More sharing options...
Recommended Posts