Joined: Jun 27, 2009
Jesus is a friend to the vindictive sociopath
Posted: Feb 5, 2016 01:26 PM
Msg. 4 of 7
This behavior is evidence of how damage is handled in the game when it comes to recharging shields. As long as a shield has damage that is lower than its maximum shield value as a result of projectile damage, any additional damage is interpreted as caused by that projectile. This I think is why when you take damage in a multiplayer game from an enemy player and then die from a grenade that you threw at your feet, or some other vehicle damage without a unit source, then the damage and kill is attributed to the last present attributable unit -- if you got the last ping on an enemy's shields, you get the kill, because you're an identifiable unit. But if you get a single shot on an enemy and their shields are still lower than maximum when they die from falling off a cliff, then you get the kill because falling damage is not an identifiable unit.
So here is something you can experiment with:
- change the collision model's value for Shield -> Recharge Rate Modifier, to 0.
Then drive a ghost into the shield. While you're in the vehicle, possessing it as a unit, the shield will constantly show a failure/recharging effect. When you dispossess the vehicle unit (get out of the vehicle), then it will stop taking damage from the vehicle -- and in this case also there is no identifiable unit possessing the vehicle through which damage can be attributed. Notice how shooting at the shield does not lower it. Now drive towards the shield and just before you run into it, shoot once at it to lower its shields from maximum. When your vehicle hits the shield, it will lower and come back up like normal, as if you had lowered it using a projectile.
So try adjusting the Recharge Rate Modifier to suit the behavior you want. Otherwise, just deal with the fact that it's a hardcoded aspect of damage and attribution.
Edited by sparky on Feb 5, 2016 at 01:28 PM
Also, you're looking for Function B in the scenery tag, for "shield vitality".
Edited by sparky on Feb 5, 2016 at 01:30 PM
Now if you're desperate, and things aren't working like they should *cough* vehicle damage globals changing from "vehicle" damage type to "plasma" *cough* then do what all the cool modders do: make some shiz-bo-fiz-nit up! Like try chain-spawning projectile damages around vehicles so that the projectiles ping the shields before the player runs them over, causing the shield to interpret the vehicle damage as part of the projectile's damage. You might need to associate the projectiles with a firing trigger, though (maybe waste a secondary for this purpose).
Edited by sparky on Feb 5, 2016 at 02:32 PM
Edited by sparky on Feb 5, 2016 at 02:33 PM
Joined: Jun 27, 2009
Jesus is a friend to the vindictive sociopath
Posted: Feb 6, 2016 12:06 PM
Msg. 6 of 7
That's a very clever workaround. So from further experiments, I discovered that... (((I'm not sure about the points in parentheses like this.)))
- If you have a covenant shield generator in your map, and you (somehow) find its entry in the game's "objects" memory table, offset 0x180 after the tail (that's 0x180 bytes after "liat" at the start of its entry) has a 0 / 1 toggle, where 0 = the shield is up and 1 = the shield is down. You can freely toggle this value, for example if you wanted to "reset" the shield at any point, or otherwise manually toggle it being up or down regardless of the timer. Now I didn't do a complete mapping of it, but I did come up with some simple offsets for this, but this toggle value is by far the most useful for manual switching. Note that if you manually switch it while it is being updated in memory, you kind of break the thing where if you keep spamming it with damage in the game, it doesn't come back up until you stop instantly damaging it. So manually changing memory values is not a one-step task usually. Also, all the effects of the rest of the interactions with it will continue as if you didn't change anything, so you'll still see the depletion and recharge effects if any. However, if you freeze the state at 0 (on) or 1 (off), then driving a vehicle into it while it's 0 (up) will not even lower the shield -- it will make it basically invincible. So basically, here's how it works: you have the maximum shield level as specified in the tag (default is 100 shield units), a recharge timer that counts down from 30 per second after every instance of damage, based upon your shield stun duration tag value (stun for 3 seconds means always count down from 90), you have several copies of a float value that keeps track of how much damage has been taken per damage cycle (reset by the timer reaching 0), several copies of another float value that looks like some kind of danger indicator, or damage intensity, where it counts down from 1.0 to 0.0 as time passes between hits over a period of 2 seconds, you have a -1 / 0 switch value that is normally -1 when the timer is normal and flips to 0 when the timer has to restart at the top in its countdown to 0, you have a bitmask field where 1<<0 is taking damage and 1<<1 is "alive", and you have a cycling value that is 0 for normal status, 8 for depleted, and a quick change from 4096 to 0 upon reset. Now when you drive over it, nothing changes except a sudden death value as 8 for depleted and 1 for the shield being down. So if you wanted to get the shields functioning properly after driving over them, you would need to toggle the shield state back to 0 for on manually, then ping the shields with normal damage so the timer starts again, and wait for the timer to reach 0, go through the shield recharge effect, and finally have the value toggle 4096 to 0. Otherwise, simply switching the shield to up manually would make it invincible, since the vehicle basically did an overriding one-hit-kill on the shield instead of pinging it with damage.
- The shield recharge rate modifier should be at 1 or some value greater than 0. If you set it to 0, that's like infinite shields, since everything basically remains at 0, except that the reset value gets locked at 4096 because there's no actual re-appearance of the shield. Damage pings as normal.
- I might be mistaken about this point, but regardless, you can ping damage on the base of the shield generator also if you want to keep the shields down indefinitely. -- (((There is only one window of opportunity for a re-ping on the shields after they have depleted if you are shooting straight at them when they reappear, unless you shoot another part of the shield generator like the base, which will ping the timer back up.)))
- This is what happens:
1) The timer starts at the top at the most recent instance of damage, counting down until the shields are fully back to normal after being stunned over the specified stun duration. Shield stun means the duration of time shields wait before recharging after the most recent damage ping. When there is damage ping, the timer starts and the 0/8/4096 cycling value sets to 0. When the timer reaches 0, the cycling value sets to 4096 for a reset, and, if the recharge rate modifier is > 0, it toggles a re-appearance of the shield and sets to 0.
2) When the shields reach full depletion after IDENTIFIABLE damage such as from a projectile or a possessed vehicle, the status is set to 8, the depletion effect is started (toggled effects run independently in the game's logic, and they are listed in their own "effects" memory table), and the timer restarts from the top as a result of the most recent damage ping's stun. Also the toggle is set to 1 for down (which makes the shield actually disappear) and the bitfield state is set to 0 since it's neither up nor taking damage anymore. And so on...
3) When the shields reach full depletion after UNIDENTIFIED damage such as when the depletion effect comes with damage, then the status does what it normally does, toggling to 8 for being depleted. The stun timer is kicked back into gear through this approach. The damage is pretty much just interpreted as normal damage, including the bitfield value changing to 3 (2 as up + 1 as taking damage while being up) when damaged and 0 when shields are down, or something like that, and the timer cycles down from the top and reaches 0, thus cycling the state value back to 0 so everything is back to normal. You can use any damage value, and have any delay, but I recommend an immediate depletion effect that does negligible damage with no visible effect. EDIT: Or looks like (e.g. is a modified version of) the default shield depletion effect.
(((If you use the single opportunity for re-pinging the shields while they are down through the depletion effect, then shooting constantly won't keep the shields down; they will reappear at maximum health.)))
Edited by sparky on Feb 6, 2016 at 12:15 PM
So for some reason, the damage timer does not re-start after you run it over with a vehicle then shoot the base. The ping sets it back up to its maximum value, but some inconsistency is preventing it from counting down to 0. Whatever the inconsistency is could actually be patched in the executable, probably with only a little difficulty, so that it recharges after you hit it with a vehicle.
You can also get a flickering effect by having the damage in a depletion effect kill the shield after it shows up again. Just set the effect to occur at like 7 seconds and it will toggle off and on.
Edited by sparky on Feb 6, 2016 at 01:23 PM