Skip to content

Commit f2c82f0

Browse files
committed
Merge branch '1.21.8' into 1.21.11
2 parents ff16e15 + 27d52d1 commit f2c82f0

16 files changed

Lines changed: 921 additions & 19 deletions

File tree

.github/workflows/publish.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@ on:
2020
type: choice
2121
description: Release type
2222
options:
23-
- alpha
24-
- beta
2523
- release
24+
- beta
25+
- alpha
2626

2727
permissions:
2828
contents: read

CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,13 @@
1+
# 3.0.1
2+
3+
- Adjusted windup time and animation for vanilla Mace, to be more instant-like
4+
- Adjusted windup time for vanilla axes
5+
- Fixed being unable to attack after dying during the windup phase of an attack, #548
6+
- Fixed crashing on invalid particle config #568
7+
- Added mine with weapons whitelist config #574
8+
- Improved Friend or Foe logic on FTB Teams membership, thanks to LeDok #571
9+
- Copper golems are now considered neutral
10+
111
# 3.0.0
212

313
- Support Minecraft 1.21.11
1.88 MB
Binary file not shown.

common/src/main/java/net/bettercombat/client/particle/SlashParticleUtil.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,9 +104,12 @@ public static List<ParticlePlacement> trailParticlesFromAttack(AttackHand attack
104104
return attackHand.attack().trailParticles();
105105
}
106106
var config = BetterCombatMod.trailConfig.value;
107-
var animationSpecific = config.animation_based.get(attackHand.attack().animation());
108-
if (animationSpecific != null) {
109-
return animationSpecific;
107+
var animations = config.animation_based;
108+
if (animations != null) {
109+
var animationSpecific = animations.get(attackHand.attack().animation());
110+
if (animationSpecific != null) {
111+
return animationSpecific;
112+
}
110113
}
111114
return List.of();
112115
}

common/src/main/java/net/bettercombat/compat/FTBTeamsCompat.java

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package net.bettercombat.compat;
22

33
import dev.ftb.mods.ftbteams.api.FTBTeamsAPI;
4+
import dev.ftb.mods.ftbteams.api.Team;
45
import dev.ftb.mods.ftbteams.api.client.KnownClientPlayer;
56
import net.bettercombat.Platform;
67
import net.bettercombat.logic.TargetHelper;
@@ -31,19 +32,36 @@ private static TargetHelper.TeamRelation checkClientTeamRelation(PlayerEntity at
3132
var manager = FTBTeamsAPI.api().getClientManager();
3233

3334
Optional<KnownClientPlayer> attackerKnownPlayerOpt = manager.getKnownPlayer(attackerPlayer.getUuid());
34-
Optional<KnownClientPlayer> targetKnownPlayerOpt = manager.getKnownPlayer(targetPlayer.getUuid());
35+
if (attackerKnownPlayerOpt.isEmpty()) {
36+
return null;
37+
}
3538

36-
if (attackerKnownPlayerOpt.isEmpty() || targetKnownPlayerOpt.isEmpty()) {
39+
Optional<KnownClientPlayer> targetKnownPlayerOpt = manager.getKnownPlayer(targetPlayer.getUuid());
40+
if (targetKnownPlayerOpt.isEmpty()) {
3741
return null;
3842
}
3943

4044
KnownClientPlayer attackerKnownPlayer = attackerKnownPlayerOpt.get();
4145
KnownClientPlayer targetKnownPlayer = targetKnownPlayerOpt.get();
4246

47+
// 1. Check if players are in the same effective team (party).
4348
if (attackerKnownPlayer.teamId().equals(targetKnownPlayer.teamId())) {
4449
return new TargetHelper.TeamRelation(true, false);
4550
}
4651

52+
// 2. Check for a mutual, two-way alliance to prevent abuse.
53+
Optional<Team> attackerTeamOpt = manager.getTeamByID(attackerKnownPlayer.teamId());
54+
Optional<Team> targetTeamOpt = manager.getTeamByID(targetKnownPlayer.teamId());
55+
56+
if (attackerTeamOpt.isPresent() && targetTeamOpt.isPresent()) {
57+
boolean attackerSeesAlly = attackerTeamOpt.get().getRankForPlayer(targetPlayer.getUuid()).isAllyOrBetter();
58+
boolean targetSeesAlly = targetTeamOpt.get().getRankForPlayer(attackerPlayer.getUuid()).isAllyOrBetter();
59+
60+
if (attackerSeesAlly && targetSeesAlly) {
61+
return new TargetHelper.TeamRelation(true, false);
62+
}
63+
}
64+
4765
return null;
4866
}
4967

@@ -53,8 +71,25 @@ private static TargetHelper.TeamRelation checkServerTeamRelation(PlayerEntity at
5371
}
5472
var manager = FTBTeamsAPI.api().getManager();
5573

56-
if (manager.arePlayersInSameTeam(attackerPlayer.getUuid(), targetPlayer.getUuid())) {
57-
return new TargetHelper.TeamRelation(true, false);
74+
Optional<Team> attackerTeamOpt = manager.getTeamForPlayerID(attackerPlayer.getUuid());
75+
Optional<Team> targetTeamOpt = manager.getTeamForPlayerID(targetPlayer.getUuid());
76+
77+
if (attackerTeamOpt.isPresent() && targetTeamOpt.isPresent()) {
78+
Team attackerTeam = attackerTeamOpt.get();
79+
Team targetTeam = targetTeamOpt.get();
80+
81+
// 1. Check if players are in the same effective team (party).
82+
if (attackerTeam.getTeamId().equals(targetTeam.getTeamId())) {
83+
return new TargetHelper.TeamRelation(true, false);
84+
}
85+
86+
// 2. Check for a mutual, two-way alliance to prevent abuse.
87+
boolean attackerSeesAlly = attackerTeam.getRankForPlayer(targetPlayer.getUuid()).isAllyOrBetter();
88+
boolean targetSeesAlly = targetTeam.getRankForPlayer(attackerPlayer.getUuid()).isAllyOrBetter();
89+
90+
if (attackerSeesAlly && targetSeesAlly) {
91+
return new TargetHelper.TeamRelation(true, false);
92+
}
5893
}
5994

6095
return null;

common/src/main/java/net/bettercombat/config/ClientConfig.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ public class ClientConfig implements ConfigData {
4343
@ConfigEntry.Gui.Tooltip
4444
public String mineWithWeaponBlacklist = "";
4545
@ConfigEntry.Gui.Tooltip
46+
public String mineWithWeaponWhitelist = "";
47+
@ConfigEntry.Gui.Tooltip
4648
public TriStateAuto firstPersonAnimations = TriStateAuto.AUTO;
4749
@ConfigEntry.Gui.Tooltip
4850
public float legAnimationThreshold = 0;

common/src/main/java/net/bettercombat/config/ServerConfig.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ public enum Curve { LINEAR, SQUARE, HALF_SQUARE }
9393
put("minecraft:player", TargetHelper.Relation.NEUTRAL);
9494
put("minecraft:villager", TargetHelper.Relation.NEUTRAL);
9595
put("minecraft:iron_golem", TargetHelper.Relation.NEUTRAL);
96+
put("minecraft:copper_golem", TargetHelper.Relation.NEUTRAL);
9697
put("guardvillagers:guard", TargetHelper.Relation.NEUTRAL);
9798
}};
9899
public LinkedHashMap<String, TargetHelper.Relation> player_relation_tags = new LinkedHashMap<>() {{

common/src/main/java/net/bettercombat/logic/WeaponSwing.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,7 @@ public int upswingTicksLeft(int time) {
1212
public int durationTicks() {
1313
return Math.round(duration);
1414
}
15+
public boolean isValid(int time) {
16+
return time >= startedAt && time <= startedAt + (durationTicks() + 1); // +1 for padding
17+
}
1518
}

common/src/main/java/net/bettercombat/mixin/client/AbstractClientPlayerEntityMixin.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,8 @@ public void playAttackAnimation(String name, AnimatedHand animatedHand, float le
145145
if(isLeftHanded()) {
146146
mirror = !mirror;
147147
}
148-
float upswingSpeed = speed / BetterCombatMod.config.getUpswingMultiplier();
148+
var trueUpswingRatio = upswing / BetterCombatMod.config.getUpswingMultiplier();
149+
float upswingSpeed = speed / trueUpswingRatio;
149150
float downwindSpeed = (float) (speed *
150151
MathHelper.lerp(Math.max(BetterCombatMod.config.getUpswingMultiplier() - 0.5, 0) / 0.5, // Choosing value :D
151152
(1F - upswing), // Use this value at config `0.5`

common/src/main/java/net/bettercombat/mixin/client/MinecraftClientInject.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,16 @@ private void pre_doItemUse(CallbackInfo ci) {
134134

135135
private boolean isTargetingMineableBlock() {
136136
if (!BetterCombatClientMod.config.isMiningWithWeaponsEnabled) {
137-
return false;
137+
var whitelist = BetterCombatClientMod.config.mineWithWeaponWhitelist;
138+
if (whitelist == null || whitelist.isEmpty()) {
139+
return false;
140+
}
141+
var itemStack = player.getMainHandStack();
142+
var id = Registries.ITEM.getId(itemStack.getItem()).toString();
143+
if (!PatternMatching.matches(id, whitelist)) {
144+
return false;
145+
}
146+
// Weapon is whitelisted — fall through to continue checks
138147
}
139148
var regex = BetterCombatClientMod.config.mineWithWeaponBlacklist;
140149
if (regex != null && !regex.isEmpty()) {
@@ -329,9 +338,14 @@ private void pre_Tick(CallbackInfo ci) {
329338
lastAttacked += 1;
330339

331340
if (ongoingSwing != null) {
332-
if (ongoingSwing.ticksLeft(currentTime()) <= 0) {
341+
var time = currentTime();
342+
var swing = ongoingSwing; // Store in local for further checks
343+
if (swing.ticksLeft(time) <= 0) {
333344
ongoingSwing = null;
334345
}
346+
if (!player.isAlive() || !swing.isValid(time)) {
347+
cancelWeaponSwing();
348+
}
335349
}
336350
cancelSwingIfNeeded();
337351
attackFromUpswingIfNeeded();

0 commit comments

Comments
 (0)