Jump to content

Handepsilon

Totem Arts Staff
  • Posts

    2008
  • Joined

  • Last visited

Everything posted by Handepsilon

  1. 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.
  2. http://www.indiedb.com/games/renegade-x/downloads it's in the bottom of the list
  3. 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
  4. 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
  5. No I might be able to UVW but I'm terrible at painting and comppsiting textures
  6. Maybe I'm a vampire?
  7. 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
  8. Alright, will add it in Version 2's patch along with CNC-Snow and my update of CNC-ShootingRange
  9. nice, when will you upload it?
  10. Anyone got a recording of the matches? Preferably someone from Team Kenz, hopefully Kenz himself.
  11. 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
  12. oh you! lol Can't wait to test it out. Will keep an eye on it
  13. You bet I will
  14. 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
  15. Also, uh.... why are you posting in my topic and not make a separate thread for the map?
  16. 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
  17. All missile locking systems are shitty in RenX now.... How can we skewer the winged beast now Rezno-!!!? oops, wrong game
  18. If nothing comes up, I'll join
  19. Coastal Beta 0.2.5 https://drive.google.com/file/d/0B6yEH_ ... sp=sharing Coastal Small Beta 0.2 https://drive.google.com/file/d/0B6yEH_ ... sp=sharing Shooting Range BETA 1 : https://drive.google.com/file/d/0B6yEH_ ... sp=sharing
  20. That's a nice tree though
  21. Updated to Version 2 Updated Eyes, Coastal and Coastal Small. Carnage Club is copied but updated is not confirmed Added ShootingRange (sniper map).
  22. Since ObeliskTheTormentor keeps requesting a sniper map, I make an attempt to make a simple sniper map yesterday. It's still BETA, so it might need lots of tweaking, or overhauls Overview : 4 bunkers, 2 on GDI and Nod each, with ammo packs on each bunkers. Also 2 buildings on each edge of the map containing health pack and armor pickup. Players spawn randomly across the base and bunkers, separated mildly and only equipped with sniper rifle. Superior health and armor are provided on the middle, along with a ramjet platform. Players will be on random class, determining their health amount Problem : SBH might be a bit OP in this map. Kismet could not detect his weapon and spawn him with GDI sniper rifle instead of Nod's Beta 0.1 : https://drive.google.com/file/d/0B6yEH_ ... sp=sharing Stable Release 1 : https://drive.google.com/file/d/0B6yEH_ ... sp=sharing No screenshot provided as of yet
  23. Coastal Epic : Beta 0.2.5 - https://drive.google.com/file/d/0B6yEH_ ... sp=sharing Coastal Small : Beta 0.2 - https://drive.google.com/file/d/0B6yEH_ ... sp=sharing - Added more path variations in infantry path for both version, and fixed some rocks on the cave to cover the gaps. - Fixed Harvester path in the Small version, now it works well - Fixed Gate in Small version - Tweaked Harvester path in Epic version, fix unconfirmed Will fix some other cosmetic problems later
  24. They don't damage the allies the same way aircraft does. It's the Anti Position-Exploit bug that damages people standing on tanks that makes them moves a lot faster than normal. If you doubt me, play the Coastal maps more often
  25. Handepsilon

    Ideas

    Preferably not 'Allahu Akbar'. It's nice to hear our God's name being spoken out but not when it's linked with terrorism
×
×
  • Create New...