-
Posts
2007 -
Joined
-
Last visited
Content Type
Profiles
Downloads
Forums
Events
Gallery
Everything posted by Handepsilon
-
.... .... .... .... ....that's like the most infamous bug since previous betas viewtopic.php?f=124&t=74202
-
Holy shit, that ship corridor spiked up the size more than twice the amount o.e iwilldownloadtomorrowincampus...
-
Goku, because SilentKnight has the privilege but not the ability to do so
-
Uh well, there's no additional variable on the Capturable MCT, so... if you're talking about properties, no there's none. Also tried to do Rx_BuildingObjective and it doesn't produce any result
-
Don't forget Lakeside, massive infantry path vehicle glitch in the mid cave there D:
-
Unfortunately.... that's what I'm still wondering about. I believe the 'Silo' part is localized string. I remembered when I had Indo localization, the string got replaced. But the script is still a jumble for me. Whatever it is, it might be hidden starting beneath the HealDamage
-
That small instruction boxes in the loading screen are not even making out well in my lowres game I miss the old UT3-styled tip of the day loading screen with Havoc walk cycle. IMO that's more informative than having to look at the instructions all at once, especially in 3/4 seconds time
-
Yes unfortunately I can't make it so that the installer auto detects the RenX install path. You can go ahead and help me with it, but I already asked Goku Dunno if Beta 5 has install path in registry though Anyway, Patch 2.1 is here, forgot to share it
-
A bit too many repetition on the rocks. Try to randomize their rotation a bit more
-
Due to the lack of kismet support, I decided to make some notes about kismeting out buildings. For now I'll do the Action and Event 1. Toggleable Advanced Defense For those who saw and played Coastal, you might be familiar with this one, so we'll take the obelisk as reference So for the Obelisk, we'll do this Placable building actor : class Rx_Building_Obelisk_Toggleable extends Rx_Building_Obelisk placeable; var(Toggling) bool bLaserActivated; //I forgot what this variable is for, maybe it's not needed, but we'll keep it for safety. Feel free to delete this and see what happens though /* The Toggle action kismet node will check for actions that goes like this. Whenever there's this function, the Toggle kismet will always fire it up, if the actor is in the Target variable */ simulated function OnToggle(SeqAct_Toggle action) { /* We'll pass this to the laser shooter actor because through the editor, only the visual building (this actor) is selectable and assignable to the kismet. Just so to be safe, we'll also pass the toggle Kismet Node Parameter*/ Rx_Sentinel_Obelisk_Laser_Toggleable(Rx_Building_Obelisk_Internals_Toggleable(BuildingInternals).laserSentinel).OnToggle(action); } defaultproperties { BuildingInternalsClass = Rx_Building_Obelisk_Internals_Toggleable } class Rx_Building_Obelisk_Internals_Toggleable extends Rx_Building_Obelisk_Internals; Internal actor : /* We rewrite the whole function, and change one line only laserSentinel = Spawn(class'Rx_Sentinel_Obelisk_Laser_Toggleable',,,,,,true); */ function SetupLaser() { local vector v,v2; laserSentinel = Spawn(class'Rx_Sentinel_Obelisk_Laser_Toggleable',,,,,,true); laserSentinel.SetOwner(self); laserSentinel.Team = self.TeamID; if(laserSentinel != none) { laserSentinel.bCollideWorld = true; //Turn off collision and translate, because collision may move the Sentinel away from the ceiling when it's spawned. v = BuildingSkeleton.GetBoneLocation('Ob_Fire'); v.z += 100; laserSentinel.setFireStartLoc(v); v2 = BuildingVisuals.location; v2.z = v.z; v2 = v2 + Normal(v-v2)*100; laserSentinel.setlocation(v2); Rx_Building_Obelisk(BuildingVisuals).SentinelLocation = laserSentinel.location; laserSentinel.Initialize(); CrystalGlowMIC = BuildingSkeleton.CreateAndSetMaterialInstanceConstant(0); Rx_SentinelWeapon_Obelisk(laserSentinel.SWeapon).CrystalGlowMIC = CrystalGlowMIC; laserSentinel.SController.TargetWaitTime = 6.0; laserSentinel.SController.bSeeFriendly=false; laserSentinel.SController.TargetWaitTime=3.0; laserSentinel.SController.SightCounterInterval=0.1; Rx_SentinelWeapon_Obelisk(laserSentinel.SWeapon).InitAndAttachMuzzleFlashes(BuildingSkeleton, 'Ob_Fire'); } } And finally, the 'Sentinel' shooter actor //============================================================================= // Controls the Obi Laser //============================================================================= class Rx_Sentinel_Obelisk_Laser_Toggleable extends Rx_Sentinel_Obelisk_Laser_Base; var bool bLaserDown; //self-explanatory /* This is the function passed from the building InputLinks correspond to the order of the left box in the node, or you can just check in the SeqAct_Toggle scripting */ simulated function OnToggle(SeqAct_Toggle action) { if (action.InputLinks[0].bHasImpulse) { //Turn on bLaserDown = FALSE; } else if (action.InputLinks[1].bHasImpulse) { //Turn off bLaserDown = TRUE; } else if (action.InputLinks[2].bHasImpulse) { // basically toggle the laser bLaserDown = !bLaserDown; } } /* Once again we rewrite this whole script (just copy and paste) but we add our LaserDown variable to check if the obelisk can fire or not */ function bool FireAt(Vector Spot) { local Vector Origin; local bool bFired; Origin = GetPawnViewLocation(); // if(RDiff(DesiredAim, CurrentAimNoRoll) <= SWeapon.GetMaxAimError()) // { if(VSize(Spot - Origin) <= GetRange() && !bLaserDown) { if(SWeapon.FireAt(Origin, CurrentAim, Spot)) { UpgradeManager.NotifyFired(); bForceNetUpdate = true; } bFired = true; } // } return bFired; } Example Kismet : 2. Capturable MCT Event And now we get to the new Beta 5 feature, the new Capturable MCT which.... unfortunately is not fully supported yet IMO. So now we start with actually creating an event for capturing and neutralizing it, just like the Power Node in UT3 but much simpler So now, we start with... Placable building actor: class Rx_CapturableMCT_Kismet extends Rx_CapturableMCT placeable; defaultproperties { BuildingInternalsClass = Rx_CapturableMCT_Internals_Kismet //This is the essential so the actor can be assigned to this event. You can now right click and 'Create event with selected actor' SupportedEvents.Add(class'Rx_SeqEvent_TechCapture') } Internal actor : class Rx_CapturableMCT_Internals_Kismet extends Rx_CapturableMCT_Internals notplaceable; /* We rewrite this because we're going to insert an action. In my opinion it's much easier to tackle this way than using Super.HealDamage() */ function bool HealDamage(int Amount, Controller Healer, class DamageType) { local int RealAmount; local float Scr; if ((Health < HealthMax || Healer.GetTeamNum() != GetTeamNum()) && Amount > 0 && Healer != None ) { RealAmount = Min(Amount, HealthMax - Health); if (RealAmount > 0) { if (Health >= HealthMax && SavedDmg > 0.0f) { SavedDmg = FMax(0.0f, SavedDmg - Amount); Scr = SavedDmg * HealPointsScale; Rx_PRI(Healer.PlayerReplicationInfo).AddScoreToPlayerAndTeam(Scr); } Scr = RealAmount * HealPointsScale; Rx_PRI(Healer.PlayerReplicationInfo).AddScoreToPlayerAndTeam(Scr); } if(Healer.GetTeamNum() != GetTeamNum()) { Amount = -1 * Amount; } Health = Min(HealthMax, Health + Amount); if(Health <= 1) { Health = 1; if(GetTeamNum() != TEAM_NOD && GetTeamNum() != TEAM_GDI) { if(Healer.GetTeamNum() == TEAM_NOD) { `LogRx("GAME"`s "Captured;"`s class'Rx_Game'.static.GetTeamName(TeamID)$","$self.class `s "id" `s GetRightMost(self) `s "by" `s `PlayerLog(Healer.PlayerReplicationInfo) ); BroadcastLocalizedMessage(MessageClass,NOD_CAPTURED,Healer.PlayerReplicationInfo,,self); ChangeTeamReplicate(TEAM_NOD,true); } else { `LogRx("GAME"`s "Captured;"`s class'Rx_Game'.static.GetTeamName(TeamID)$","$self.class `s "id" `s GetRightMost(self) `s "by" `s `PlayerLog(Healer.PlayerReplicationInfo) ); BroadcastLocalizedMessage(MessageClass,GDI_CAPTURED,Healer.PlayerReplicationInfo,,self); ChangeTeamReplicate(TEAM_GDI,true); } // TriggerEventClass will trigger out any event node of this type. We set the instigator to healer and set the output to 0. This is the Captured event BuildingVisuals.TriggerEventClass(Class'Rx_SeqEvent_TechCapture',Healer,0); // } else { if (TeamID == TEAM_NOD) BroadcastLocalizedMessage(MessageClass,NOD_LOST,Healer.PlayerReplicationInfo,,self); else if (TeamID == TEAM_GDI) BroadcastLocalizedMessage(MessageClass,GDI_LOST,Healer.PlayerReplicationInfo,,self); `LogRx("GAME"`s "Neutralized;"`s class'Rx_Game'.static.GetTeamName(TeamID)$","$self.class `s "id" `s GetRightMost(self) `s "by" `s `PlayerLog(Healer.PlayerReplicationInfo) ); ChangeTeamReplicate(255,true); Health = BuildingVisuals.HealthMax; // Another trigger event with input set to 1. This is the Neutralized event BuildingVisuals.TriggerEventClass(Class'Rx_SeqEvent_TechCapture',Healer,1); // } } else if (Amount < 0) TriggerUnderAttack(); // We can actually make another event here for the Under Attack event return True; } return False; } DefaultProperties { TeamID = 255 } The kismet node class Rx_SeqEvent_TechCapture extends SequenceEvent; defaultproperties { ObjName="Tech Building Event" ObjCategory="Renegade X Buildings" // There OutputLinks correspond to the TriggerEventClass function parameter. So if there should be more output links, it can be added at will OutputLinks[0]=(LinkDesc="Captured") OutputLinks[1]=(LinkDesc="Neutralized") bPlayerOnly=false MaxTriggerCount=0 } Example Kismet Node : And there we have it. Feel free to ask anything. PS : Hopefully this is included in the next patch, as well as some more Kismet nodes such as Building Destroyed, Harvester dumped and spawned from refinery (Destroyed is already tackled in the Vehicle script), add score, etc.
-
http://www.indiedb.com/games/renegade-x/downloads it's in the bottom of the list
-
sure thing, I think I've done creating kismet events before. I believe it involves 'ForEach' iteration. I'll check up and post it later Edit : And so I have! viewtopic.php?f=136&p=152067
-
What I don't understand is why not just make a new event that fires when it's capped or neutralized? That's effective AND efficient
-
No I might be able to UVW but I'm terrible at painting and comppsiting textures
-
Maybe I'm a vampire?
-
Stable release is now here, now with more openness and bot support! Also features health, ammo and armor pickup https://drive.google.com/file/d/0B6yEH_ ... sp=sharing
-
Alright, will add it in Version 2's patch along with CNC-Snow and my update of CNC-ShootingRange
-
nice, when will you upload it?
-
Anyone got a recording of the matches? Preferably someone from Team Kenz, hopefully Kenz himself.
-
You know what was the most interesting part? that engi rush to ref in Field. I think all 10 of us were there. I just try to keep myself distanced away since turret splash damage can be a bitch. 2 secs after I enter the ref... boom, no ref. Yodh's team tried to do the same, I think, but we lost ref only after 20 mins later when Minji and Nanas snuck in PS : Bananas OP plz nerf
-
Make C4 disarm detection client-sided
Handepsilon replied to Handepsilon's topic in Feedback & Bug Reports
oh you! lol Can't wait to test it out. Will keep an eye on it -
You bet I will
-
You guys all know the infamous C4 bug, where the placement of C4 in server and client is not synchronized. I propose that the C4 disarm detection to be client-sided, so wherever the client sees the mines, regardless it's sync or not, they can be disarmed by firing into it To make it easier to understand 1. Client sees mines 2. Client fires at mines 3. Client sends HP reduction order to server 4. Server reduces mines HP
-
Also, uh.... why are you posting in my topic and not make a separate thread for the map?
-
I missed the Beta release.... Note : When you make a beta release, always post for prompt. People aren't notified (unless maybe if they set the email notification) when you make edits