Jump to content

R&D XCOM Map Alterations


Amineri

Recommended Posts

Normaly I play with the "show postprocessing" off, revealing the entire map and boosting fps on my laptop but I can see the sectoid pods because they have a webbed abductee with them(it disapears when they trigger). Does anybody know where should I poke to remove the abductee?

 

 

Abduction pods have webbed abductee spawned at the center of the pod's location. It is spawned by the script during the deployment phase. There probably is some kismet event, like on spawn or something, to track it down.

 

Thanks for the test map, I'll check it out. If we'll make it work, we could prevent meld from blocking doors and ladders by placing no-spawn volumes appropriately.

Link to comment
Share on other sites

  • Replies 473
  • Created
  • Last Reply

Top Posters In This Topic

Of course we could use a new type of volume, the xcom no spawn volume can block civvies and or aliens too.

 

I think only sectoids have the abductee.. Probably it's even visible through the fog of war if the camera is tilted in the right angle.

Link to comment
Share on other sites

Yes, you're right, we can create our own volume.

 

I do remember abductees are spawned for abduction pods, but I can't say for sure if this is tied in to pod's species. Needs checking.

 

I've finished coding a simple mutator for adding new bomb missions. Will release it after some additional tests.

Edited by wghost81
Link to comment
Share on other sites

I think I found the code responsible for spawning abductees for secoids and thinmen, its in XComAlienPod. Removing CenterpieceMesh.SetStaticMesh(FoggedBodyMesh); should do the trick I suppose

 


simulated event PostBeginPlay()
{
local StaticMesh FoggedBodyMesh;

super(Actor).PostBeginPlay();
FoggedBodyMesh = StaticMesh(XComContentManager(class'Engine'.static.GetEngine().GetContentManager()).GetGameContent("CHH_FoggedMaleCivs.Meshes.CivAlienPod"));
CenterpieceMesh.SetStaticMesh(FoggedBodyMesh);
//return;
}

 

 

 

Also, I have in mind a method to hide nodes/bomb/meld pods until a unit has sight on the spot where they stand. This will prevent getting hints by tilting the camera and scanning the map. My proof of concept did not work because the it needs aditional tuning expained bellow

 

Here's my idea:

 

Hide all nodes and their particles

Place a marker 96x96x96 volume on each node, place a XComSquadVisiblePoint on each node

 

XComSquadVisiblePoint trigger a global event when seen by a unit

 

An event listener waits for the event, when triggered it gets the instigator (the actor which triggered it), we search for the marker volume which contains the instigator (the XComSquadVisiblePoint), then we search for the node which is contained in that volume and make it visible

 

The problem here is that XComSquadVisiblePoint triggers the event but does not set itself as the instigator, probably it would be required to code our own SquadVisiblePoint which does.

 

I think I might pull this off with a kismet map patch, but each map with meld/bomb would required it

Edited by LiQuiD911
Link to comment
Share on other sites

Got it :smile: here's a patch which hides the nodes/bomb/meld until they are seen by a unit. Works in LW with the random meld/bomb.

 

https://www.dropbox.com/s/w53azoo4p2j3e44/patch_hide_randomized_objects.upk?dl=0

 

It's still experimental, the bomb does not always show when it's on a corner next to a wall.. actualy the bomb sighted dialogue does not trigger too, there's a problem with the Xcomsquadvisiblepoint

 

I would recommend adding buttons/UI to LW to toggle devconsole commands "toggleFOW" and "show postprocessing", it's a different experience playing with one of those enabled, the maps have beautiful details totally hidden by the fog

Edited by LiQuiD911
Link to comment
Share on other sites

Gosh -- i also could really-very-absolutely use some sort of dedicated DevConsole(+ Enhanced) access via easy to reach "Buttons".

Just that "Show post-processing" hints me about a precious development feature that could have made my life sooooooooooo much easier when scanning for UI elements and other items of interests that show up on as many different screens and under various conditions.

ID tags, textures... SHOW + STAT + VIEWMODE + TOGGLE "X" (etc) are already efficient, i know... but, modding is a monster of his own in certain aspects.

 

Heck, even the "LOG" is not rationally intuitive and can't actually be accessed when we need it the most -- at runtime! :)

Link to comment
Share on other sites

I really intended that for normal users which don't use devconsole, I type my dev commands at startup.

 

@wghost, I think I managed to fix the squadvisiblepoint problem, by switching off the LOS blocking of the bomb actor (which is buggy by default, it only provides los blocking when it's near wall and not in the open, a while ago I did some testing) and raising the z of it's squadvisiblepoint by 64.. now my squadvisiblepoint triggers , but the bomb sighted does not always trigger on close quarters maps like the slaughter house.

 

The bomb timer probably should start at 4 or 5 due the extra difficulty

 

What's the maximum number of meld pods? The patch works for up to 15 bomb nodes, 5 meld pods and 1 bomb, but i can easily add more

 

update:

now the patch also hides the unactivated pod abductee (which moves along with the pod and is visible through the fog of war). I think only sectoids and thinmen had it.

 

Also, I'm getting NetIndex errors because of all my incremental modifications to the UDK classes, it seems that the streaming map technique isn't perfect as I thought. It's fixable by recooking all the patches together but it's going to be problematic when multiple sources start edithing those.. anyone who wants to code his own udk classes will have to use a unique class package

Edited by LiQuiD911
Link to comment
Share on other sites

In vanilla you can't have more than 2 meld canisters per map and in LW this number goes up to 3. By editing the script and using meld placement mutator one can spawn as many canisters as they want. :)

 

I was a little busy with my real life work lately, so I was unable to test any of your patches yet. Although the idea looks great.

 

I'm using uncooked scripts and afaik LW assets package also is uncooked. Can you do the same thing with map files?

Link to comment
Share on other sites

If I distribute uncooked files I'll have to also bundle the script packages which I edit frequently. I can give you all the script sources if you want to make a mutator instead of using a streaming map. One more thing, I place all the extra volumes and my squad visible point on the map and then move them around, spawning them only when needed would be a better solution.

 

Here's a link with the uncooked patch and script packages

https://www.dropbox.com/sh/qowavvpkvfkp004/AAAIz7E5bdBCJXLiUvUPwLria?dl=0

 

And some of the sources, the rest is kismet and and objects with particular tags to filter them

Some of these use a "wait for battle running" kismet widget, DynamicVolume is a simple volume I made ( It does not have any code in it)

 

 

/*******************************************************************************
* XComSquadVisiblePoint generated by Eliot.UELib using UE Explorer.
* Eliot.UELib ? 2009-2013 Eliot van Uytfanghe. All rights reserved.
* http://eliotvu.com
*
* All rights belong to their respective owners.
*******************************************************************************/
class SquadVisiblePoint extends Actor
hidecategories(Navigation)
placeable;



var export editinline SpriteComponent VisualizeSprite;

simulated event PostBeginPlay()
{
SetTickIsDisabled(false);
//return;
}

simulated event Tick(float dt)
{
local int I;
local float fDistance;
local XGSquad kSquad;
local XGUnit kUnit;
local DynamicVolume containtingVolume;
local Actor curActor;


super.Tick(dt);

if(XComTacticalGRI(class'Engine'.static.GetCurrentWorldInfo().GRI).m_kBattle != none)
{

kSquad = XGBattle_SP(XComTacticalGRI(class'Engine'.static.GetCurrentWorldInfo().GRI).m_kBattle).GetHumanPlayer().GetSquad();

if(kSquad != none)
{
I = 0;

while(I < kSquad.GetNumMembers())
{
kUnit = kSquad.GetMemberAt(I);

if((!kUnit.IsDead() && !kUnit.m_bOffTheBattlefield) && !kUnit.IsCriticallyWounded())
{

if(class'XComWorldData'.static.GetWorldData().CanSeeActorToLocation(kUnit.GetPawn(), Location))
{

fDistance = float(kUnit.GetSightRadius() * 64);
// End:0x41E
if(VSizeSq(kUnit.GetLocation() - Location) < (fDistance * fDistance) )
{


foreach class'Engine'.static.GetCurrentWorldInfo().AllActors(class'DynamicVolume', containtingVolume)
{
if(containtingVolume.Encompasses(self)) break;

}

foreach class'Engine'.static.GetCurrentWorldInfo().AllActors(class'Actor', curActor)
{
if(
( containtingVolume.IsOverlapping(curActor)
&&( curActor.ObjectArchetype.Name == 'ARC_AlienEnergyNode_XLA'
|| curActor.ObjectArchetype.Name == 'ARC_AlienBomb_XLA'
|| curActor.IsA('XComMeldContainerActor')
)

)
||
( containtingVolume.Encompasses(curActor)
&&( curActor.ObjectArchetype.Name == 'ARC_Alien_Bomb_Active'
|| curActor.ObjectArchetype.Name == 'ARC_Alien_Bomb_Exploding'
|| curActor.ObjectArchetype.Name == 'ARC_Alien_Bomb_Destroyed'
|| curActor.ObjectArchetype.Name == 'ARC_Alien_Bomb_Inactive'
|| curActor.ObjectArchetype.Name == 'ARC_Energy_Node_Active'
|| curActor.ObjectArchetype.Name == 'ARC_Energy_Node_Inactive')
)


)
{
curActor.SetHidden(false);
}


}


SetTickIsDisabled(true);
break;
}








}

}
++ I;

}
}

}
//return;
}

defaultproperties
{
begin object name=Sprite class=SpriteComponent

end object

VisualizeSprite=Sprite


Components(0)=Sprite

}

 

 

 

 

 

class SeqAct_ToggleHide extends SequenceAction
hidecategories(Object)
forcescriptorder(true);

var() bool Hidden;
var() Actor Target;


event Activated()
{
Target.SetHidden(Hidden);
ActivateOutputLink(0);
}

defaultproperties
{
bCallHandler=false
VariableLinks(0)=(ExpectedType=Class'Engine.SeqVar_Object',LinkDesc="Actor",PropertyName=Target)
ObjName="Toggle Hidden"
}

 

 

 

 

/*******************************************************************************
* SeqAct_RemoveActor generated by Eliot.UELib using UE Explorer.
* Eliot.UELib ? 2009-2013 Eliot van Uytfanghe. All rights reserved.
* http://eliotvu.com
*
* All rights belong to their respective owners.
*******************************************************************************/
class SeqAct_SetLOSBlocking extends SequenceAction
hidecategories(Object)
forcescriptorder(true);


var() Actor Target;
var() bool bBlockUnitVisibility;

event Activated()
{
if ( Target.IsA( 'XComLevelActor') )
{

XComLevelActor(Target).VisibilityBlockingData.bBlockUnitVisibility = bBlockUnitVisibility;

}
else if (Target.IsA('XComFracLevelActor'))
{
XComFracLevelActor(Target).VisibilityBlockingData.bBlockUnitVisibility = bBlockUnitVisibility;
XComFracLevelActor(Target).bAlwaysConsiderForCover = false;
XComFracLevelActor(Target).bIgnoreForCover = false;

//XComFracLevelActor(Target).bCanClimbOver = false;
//XComFracLevelActor(Target).bCanClimbOnto = false;
// Target.bCanStepUpOn = false;
//XComFracLevelActor(Target).CoverForceFlag = CoverForce_Default;

}


ActivateOutputLink(0);
}

defaultproperties
{
bCallHandler=false
VariableLinks(0)=(ExpectedType=Class'Engine.SeqVar_Object',LinkDesc="XComLevelActor",PropertyName=Target,bWriteable=true)
ObjName="Set LOS Blocking"
}

 

 

 

 

class SeqAct_HidePodAbductees extends SequenceAction
hidecategories(Object)
forcescriptorder(true);

event Activated()
{
local XComAlienPod curActor;

foreach class'Engine'.static.GetCurrentWorldInfo().AllActors(class'XComAlienPod', curActor)
{
curActor.m_bShowCenterpiece = false;
curActor.HidePodBody();
}





ActivateOutputLink(0);
}

defaultproperties
{
ObjName="Hide Pod Abductees"
InputLinks(0)=(LinkDesc="In")
OutputLinks(0)=(LinkDesc="Out")
VariableLinks.Empty
}

 

 

Link to comment
Share on other sites

  • Recently Browsing   0 members

    • No registered users viewing this page.

×
×
  • Create New...