Edit 2021-10-27: Indie Stone released Project Zomboid build 41.56, and at first look I think they've fixed the bug correctly. I'll write a post that goes into detail soon.
Edit 2021-09-30: In 41.55 they have "fixed" this bug by changing the code so that falling clothing no longer protects you. They also adjusted some of the chancetofall rates on some helmets so that they never fall. They have not fixed the bug that essentially made chancetofall actually represent the chance that the item would stay on. I've covered this in a new post.
Bandanas are the most OP protective clothing in all Project Zomboid! They deflect almost 90% of front attacks from a single zombie!
Glasses deflect almost 45% of all front attacks from a single zombie, and you can START with glasses in vanilla Project Zomboid. That's better than taking the (fixed in 41.54) Thick Skinned trait!
I'll have more examples of the total protection you get from some vanilla Project Zomboid clothing at the end, but let me explain how this works.
I covered head protection in another blog post, and at the time I thought that helmets/hats could only fall off during an attack to the head or neck. I didn't look carefully enough at the code, because masks and glasses also can fall off, and all of those clothing items can fall off during ANY zombie attack.
When any piece of clothing falls off, that means that a zombie attack hit your character and the falling clothing nullified the attack.
So at every opportunity, you should wear a hat/helmet, glasses, and a bandana mask. Each of those has a chance of completely nullifying a zombie attack that would otherwise hit you!
BodyDamage Class
Let's go back to the BodyDamage class to demonstrate how hats/helmets/glasses/bandanas can fall and nullify "successful" zombie attacks:
if (Rand.Next(100) > n4) { n = 1; boolean bl4 = false; if (this.getParentChar().helmetFall(n3 == BodyPartType.ToIndex(BodyPartType.Neck) || n3 == BodyPartType.ToIndex(BodyPartType.Head))) { return false; }
In the BodyDamage class, once your character is hit by a zombie attack one of the first things the code does is check getParentChar().helmetFall.
It sends TRUE if the target of the attack was either the neck or head. In my earlier post, I misinterpreted this to mean that helmetFall was only called if the attack was the neck or head - I was wrong about that.
And you can see here that if helmetFall is true, this method returns false, meaning the attack is nullified and no damage is recorded on your character.
IsoGameCharacter Class
So let's take a closer look at helmetFall, in the IsoGameCharacter class:
public boolean helmetFall(boolean bl, String string) { IsoPlayer isoPlayer = (IsoPlayer)Type.tryCastTo((Object)this, IsoPlayer.class); boolean bl2 = false; InventoryItem inventoryItem = null; IsoZombie isoZombie = (IsoZombie)Type.tryCastTo((Object)this, IsoZombie.class); if (isoZombie != null && !isoZombie.isUsingWornItems()) { // Code skipped because this is only for Zombies } else if (this.getWornItems() != null && !this.getWornItems().isEmpty()) { for (int i = 0; i < this.getWornItems().size(); ++i) { WornItem wornItem = this.getWornItems().get(i); InventoryItem inventoryItem3 = wornItem.getItem(); String string2 = wornItem.getLocation(); if (!(inventoryItem3 instanceof Clothing)) continue; int n = ((Clothing)inventoryItem3).getChanceToFall(); if (bl) { n += 40; } if (inventoryItem3.getType().equals(string)) { n = 100; } if (((Clothing)inventoryItem3).getChanceToFall() <= 0 || Rand.Next((int)100) < n) continue; IsoFallingClothing isoFallingClothing = new IsoFallingClothing(this.getCell(), this.getX(), this.getY(), PZMath.min((float)(this.getZ() + 0.4f), (float)((float)((int)this.getZ()) + 0.95f)), Rand.Next((float)-0.2f, (float)0.2f), Rand.Next((float)-0.2f, (float)0.2f), inventoryItem3);
Remember that bl was TRUE if the target was the head or neck. But even attacks on other body parts make it to this part of the code (with bl set to FALSE).
We skip over some code because it only applies to zombies. Maybe I'll go over that in another post. It actually doesn't protect the zombies as much from attacks.
Then we go through every piece of clothing worn by the character. This includes every piece of clothing, not just helmets and hats.
We skip the code if it isn't a piece of clothing, and continue to the next piece of clothing.
Then we get the ChanceToFall, and call that n.
(As an example, let's look at the Bandana Mask, which has a chance to fall of 5 - at the end of this entry I have a list of all vanilla items that can fall, with their ChanceToFall value).
Here we see bl used. If the target was the head or neck, bl is true, and n is increased by 40 (to 45 for our example).
And then there is the decision line - if a random d100 roll is less than n (45 if the target was the head/neck, 5 otherwise), then we continue. Continue means we go back and look at the next item of clothing in the list - nothing happens, and we go to the next piece of clothing worn by the character.
And if we get past the d100 check, the clothing falls. In the Bandana example, this means that Bandanas stay on 5% of the time, and when the target is the head or neck they stay on 45% of the time.
As I've reported before, this is a bug. If the Bandana Mask should have the low 5% chance of falling, not staying on. So this line should read Rand.Next((int)100) >= n.
How Much Protection Is This?
In my last post, I calculated that a single zombie attacking from the front targets the neck 6.4% of the time, and the head or neck 12.7% of the time. There's a little rounding there, so I'm just going to use the slightly more accurate figure of 6.36% for head hits (and neck hits) in this example.
Bandanas (as a mask or on your head) have a ChanceToFall of 5, meaning there is a 55% chance to fall from a head/neck attack, and a 95% chance to fall for other body parts. If a head is targeted 6.36% of the time and the neck is targeted 6.36% of the time, then all other body parts together are targeted 87.28% of the time.
- Head/Neck: 55% chance to fall * 12.72 chance of being targeted
- Other: 95% chance to fall * 87.28% chance of being targeted
Total Protection: 89.912%
Glasses have a ChanceToFall of 50.
Total Protection = 10% * .1272 + 50% * .8728 = 44.912%
Reflective Ski Glasses (and Safety Goggles and some other eyewear) have a ChanceToFall of 20.
Total Protection = 40% * .1272 + 80% * .8728 = 71.312%
Baseball Caps (and Tinfoil Hats) have a ChanceToFall of 80, so the protection isn't great. If you are hit in the head or neck while wearing them, they never fall off. Plus they don't have any bite or scratch protection. Still they, are better than nothing because when other parts of your body are hit, they might fall off. Plus, you can start with them.
Total Protection = 20% * .8728 = 17.456%
Calculating the protection from items like the Riot Helmet was a little more complicated, because even when they don't fall off of your head they offer 100% protection to the head, so that modifies the protection a little. I ran some items through my spreadsheet (with slightly more accurate numbers):
- Riot Helmet - 96.52% Total Protection
- Football Helmet - 94.65% Total Protection
- Military Helmet - 88.01% Total Protection
- Hard Hat or Firefighter Helmet - 78.73% Total Protection
Also remember that these values combine if you are wearing more than one.
If you are wearing a head bandana + a bandana mask + regular glasses, the total protection is actually
1 - (1-0.89912) * (1-0.89912) * (1-0.44912) = 99.44%!
If you start with a baseball cap + regular glasses, you get to start with a protection value of
1 - (1-0.17456) * (1-0.44912) = 54.53%!
Comments On the Bug
So one of the reasons this is such a big deal is because of the bug I mentioned. Things that should stay on almost all the time are falling off, and items that should fall easily are staying on.
I suspect that Indie Stone will rework this mechanic a little more than just fixing the specific bug I mentioned. If they ONLY fix my bug, baseball caps will become pretty OP, falling off 100% of the time the head or neck is attacked, and 80% of the time other body parts are attacked. But at least baseball caps are supposed to be fairly easy to fall off in real life. Bugged Football Helmets fall off to 57% of head/neck attacks, and 97% to other attacks.
Whatever work they do to this part of the code, I'll cover it when it changes. I suspect glasses will still be worth wearing, even if they aren't as powerful as they are now.
Vanilla Items That Can Fall
Here's a list of vanilla items that can fall, and the base % chance that they will fall. Remember, while this bug still exists, it is actually the base % chance that they won't fall. For the best benefit right now, pick items with a low percentage. Once the bug is fixed, I'll update this blog post and tell everyone to pick items with a high percentage chance of falling.
Military Helmet 10 Bandana (Head) 5 Baseball Cap 80 KY Baseball Cap 80 Baseball Cap 80 Army Baseball Cap 80 Kentucky Baseball Helmet 10 Riverside Rangers Baseball Helmet 10 Z Hurricanes Baseball Helmet 10 Beanie Hat 40 Beret 80 Army Beret 80 Bicycle Helmet 20 Chef Hat 80 Cowboy Hat 80 Crash Helmet 10 Motorcycle Helmet 3 Police Motorcycle Helmet 10 USA Crash Helmet 10 Ear Muffs 80 Ear Protectors 80 Fast Food Server Hat 80 Ice Cream Server Hat 80 Spiffo's Server Hat 80 Fedora 80 Black Band Fedora 80 Firefighter Helmet 20 Football Helmet 3 Tartan Golf Cap 80 Golf Cap 80 Hard Hat 20 Mining Helmet 20 Hockey Helmet 10 Jockey Helmet - 1 10 Jockey Helmet - 2 10 Jockey Helmet - 3 10 Jockey Helmet - 4 10 Jockey Helmet - 5 10 Jockey Helmet - 6 10 Police Trooper Hat 70 Police Deputy Hat 70 Raccoon Hat 30 Ranger Hat 70 Riding Helmet 10 Riot Helmet 1 Santa Hat 80 Green Santa Hat 80 Shower Cap 80 Airforce Helmet 10 Spiffo Suit Head 10 Summer Hat 80 Medical Cap 80 Sweatband 50 Wedding Veil 80 Welder Mask 30 Winter Hat 40 Woolly Hat 40 Bucket Hat 80 Bonnie Hat 80 Visor 80 Peaked Army Cap 80 Bandana (Tied) 5 Bandana (Face) 5 Newspaper Hat 80 Party Hat with Stars 80 Coloured Party Hat 80 Tin Foil Hat 80 Hockey Goalie Mask 30 Reflective Ski Sunglasses 20 Aviator Glasses 50 Glasses 50 Reading Glasses 50 Safety Goggles 20 Shooting Glasses 20 Ski Goggles 20 Sunglasses 50 Swimming Goggles 30
Although Riot Helmets, Football Helmets, and Motorcycle Helmets fall more easily than the bandana, they already offered 100% protection to the head, so I don't consider them as OP as bandanas.
Thanks for reading! If you see any mistakes, or if you have a question you'd like me to answer, let me know in the comments!
No comments:
Post a Comment