Skip to content

Commit 32fb1db

Browse files
committed
修复一些bug
1 parent a978749 commit 32fb1db

File tree

6 files changed

+80
-14
lines changed

6 files changed

+80
-14
lines changed

src/main/java/xyz/lisbammisakait/RelightTheThreePointStrategy.java

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import net.minecraft.entity.player.PlayerInventory;
2121
import net.minecraft.inventory.Inventory;
2222
import net.minecraft.item.ItemStack;
23+
import net.minecraft.network.packet.s2c.play.GameStateChangeS2CPacket;
2324
import net.minecraft.scoreboard.ScoreAccess;
2425
import net.minecraft.scoreboard.Scoreboard;
2526
import net.minecraft.scoreboard.ScoreboardCriterion;
@@ -46,11 +47,9 @@
4647
import xyz.lisbammisakait.network.packet.SkillSlotPayload;
4748
import xyz.lisbammisakait.skill.ActiveSkillable;
4849
import xyz.lisbammisakait.tools.Pile;
49-
5050
import java.util.Collection;
5151
import java.util.Collections;
5252
import java.util.concurrent.atomic.AtomicInteger;
53-
5453
import static xyz.lisbammisakait.skill.MarkItem.MARKSLOT;
5554
import static xyz.lisbammisakait.tools.Pile.*;
5655

@@ -62,7 +61,7 @@ public class RelightTheThreePointStrategy implements ModInitializer {
6261
// That way, it's clear which mod wrote info, warnings, and errors.
6362
public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID);
6463
private boolean isMapBinding = false;
65-
private int gameStatus = 0;
64+
public static int gameStatus = 0;
6665
@Override
6766
public void onInitialize() {
6867
// This code runs as soon as Minecraft is in a mod-load-ready state.
@@ -77,6 +76,9 @@ public void onInitialize() {
7776
//下方法即将被废弃,请使用新api
7877
// ServerPlayerEvents.ALLOW_DEATH.register(this::preventDeath);
7978
//以下为新api
79+
// PlayerEvents.DROP_ITEM.register((player, stack, source) -> {
80+
// return ActionResult.FAIL; // 返回 FAIL 表示取消丢弃物品的操作
81+
// });
8082
ServerLivingEntityEvents.ALLOW_DEATH.register(this::handlePlayerDeath);
8183
AttackEntityCallback.EVENT.register(this::deadPlayerDisarm);
8284
// 注册服务器tick事件
@@ -137,8 +139,11 @@ private ActionResult deadPlayerDisarm(PlayerEntity playerEntity, World world, Ha
137139
private boolean handlePlayerDeath(LivingEntity livingEntity, DamageSource damageSource, float damageAmount){
138140
if(livingEntity instanceof ServerPlayerEntity player){
139141
ItemStack mark = player.getInventory().getStack(MARKSLOT);
142+
mark.set(RtTPSComponents.REMAININGRESPAWNCOUNT_TYPE, mark.get(RtTPSComponents.REMAININGRESPAWNCOUNT_TYPE) - 1);
140143
int rsc = mark.get(RtTPSComponents.REMAININGRESPAWNCOUNT_TYPE);
141-
mark.set(RtTPSComponents.REMAININGRESPAWNCOUNT_TYPE, rsc - 1);
144+
Scoreboard scoreboard = player.getServer().getScoreboard();
145+
ScoreboardObjective respawnCountSBO = scoreboard.getNullableObjective("respawnCount");
146+
scoreboard.getOrCreateScore(player::getNameForScoreboard, respawnCountSBO).setScore(player.getInventory().getStack(MARKSLOT).getOrDefault(RtTPSComponents.REMAININGRESPAWNCOUNT_TYPE,5));
142147
if(rsc==-1) {
143148
//死亡后设置旁观者模式
144149
if (!handleGameOver(livingEntity)) player.interactionManager.changeGameMode(GameMode.SPECTATOR);
@@ -154,15 +159,18 @@ private boolean handlePlayerDeath(LivingEntity livingEntity, DamageSource damage
154159
}
155160
private boolean handleGameOver(LivingEntity livingEntity){
156161
MinecraftServer server = livingEntity.getServer();
157-
AtomicInteger deadPlayerCount = new AtomicInteger();
162+
AtomicInteger deadPlayerCount = new AtomicInteger(0);
158163
//检测玩家是否全部死亡
159164
server.getPlayerManager().getPlayerList().forEach(player -> {
160165
if(player.getInventory().getStack(MARKSLOT).get(RtTPSComponents.REMAININGRESPAWNCOUNT_TYPE)==-1){
161166
deadPlayerCount.getAndIncrement();
167+
LOGGER.info(player.getName().getString()+"已死亡");
162168
}
163169
});
170+
LOGGER.info("死亡玩家数量:"+deadPlayerCount.get()+ "总玩家数量:"+server.getPlayerManager().getPlayerList().size());
164171
//如果全部死亡或一人存活则游戏结束
165172
if (deadPlayerCount.get() >= server.getPlayerManager().getPlayerList().size()-1) {
173+
LOGGER.info("游戏结束");
166174
//游戏结束后重置玩家状态
167175
server.getPlayerManager().getPlayerList().forEach(player -> {
168176
player.sendMessage(Text.of("游戏结束"), true);
@@ -171,18 +179,19 @@ private boolean handleGameOver(LivingEntity livingEntity){
171179
attribute.removeModifier(MAX_HEALTH_ID);
172180
}
173181
//传送回大厅
182+
player.interactionManager.changeGameMode(GameMode.ADVENTURE);
174183
player.teleport(player.getServer().getWorld(player.getWorld().getRegistryKey()), 167, 257, 280, Collections.emptySet(), 0, 0, false);
175184
player.getInventory().clear();
176185
player.setOnFire(false);
177186
player.setHealth(player.getMaxHealth());
178187
player.clearStatusEffects();
179-
player.interactionManager.changeGameMode(GameMode.ADVENTURE);
180188
});
181189
//设置游戏结束
182190
Scoreboard scoreboard = server.getScoreboard();
183191
ScoreboardObjective respawnCountSBO = scoreboard.getNullableObjective("isGameStarted");
184192
ScoreAccess scoreAccess = scoreboard.getOrCreateScore(() -> "gameStarted", respawnCountSBO);
185193
scoreAccess.setScore(2);
194+
gameStatus = 2;
186195
return true;
187196
}
188197
return false;
@@ -209,7 +218,7 @@ private void respawnPlayer(ServerPlayerEntity player) {
209218
player.sendMessage(Text.of("复活倒计时:0s"), true);
210219
Inventory inventory= player.getInventory();
211220
int faction = inventory.getStack(0).getOrDefault(RtTPSComponents.FACTION_TYPE, 0);
212-
int maxY = 257;
221+
int maxY = 150;
213222
switch (faction){
214223
case 0:
215224
Pile[] shu = spreadPlayer(world, new Vec2f(0, 60), 1, 25, maxY, false, Collections.singleton(player));
@@ -263,8 +272,8 @@ private void serverEndTick(MinecraftServer server){
263272
//-1为游戏进行中,0为游戏未开始,1为游戏开始,2为游戏结束
264273
private void changeGameStatus(MinecraftServer server){
265274
Scoreboard scoreboard = server.getScoreboard();
266-
ScoreboardObjective respawnCountSBO = scoreboard.getNullableObjective("isGameStarted");
267-
ScoreAccess scoreAccess = scoreboard.getOrCreateScore(() -> "gameStarted", respawnCountSBO);
275+
ScoreboardObjective gameStartedSBO = scoreboard.getNullableObjective("isGameStarted");
276+
ScoreAccess scoreAccess = scoreboard.getOrCreateScore(() -> "gameStarted", gameStartedSBO);
268277
if(scoreAccess.getScore()==1){
269278
// server.getPlayerManager().getPlayerList().forEach(player -> {
270279
// if(player.getInventory().contains(ModItems.LEITINGZHIZHANG.getDefaultStack())){
@@ -277,18 +286,27 @@ private void changeGameStatus(MinecraftServer server){
277286
player.sendMessage(Text.of("游戏开始"), true);
278287
player.setHealth(player.getMaxHealth());
279288
//给玩家添加抗性效果
280-
player.addStatusEffect(new StatusEffectInstance(StatusEffects.RESISTANCE, 5 * 20, 5));
289+
player.addStatusEffect(new StatusEffectInstance(StatusEffects.RESISTANCE, 10 * 20, 5));
281290
});
282291
}
292+
//复活次数计分板
293+
if(scoreboard.getNullableObjective("respawnCount")==null){
294+
scoreboard.addObjective("respawnCount", ScoreboardCriterion.DUMMY, Text.of("剩余复活次数"), ScoreboardCriterion.RenderType.INTEGER,true,null);
295+
}
296+
ScoreboardObjective respawnCountSBO = scoreboard.getNullableObjective("respawnCount");
297+
server.getPlayerManager().getPlayerList().forEach(player -> {
298+
scoreboard.getOrCreateScore(player::getNameForScoreboard, respawnCountSBO).setScore(player.getInventory().getStack(MARKSLOT).getOrDefault(RtTPSComponents.REMAININGRESPAWNCOUNT_TYPE,5));
299+
});
283300
}
284301
private void createScoreboard(MinecraftServer server) {
285302
Scoreboard scoreboard = server.getScoreboard();
286303
if(scoreboard.getNullableObjective("isGameStarted")==null){
287304
scoreboard.addObjective("isGameStarted", ScoreboardCriterion.DUMMY, Text.of("游戏是否开始"), ScoreboardCriterion.RenderType.INTEGER,true,null);
288305
}
289-
ScoreboardObjective respawnCountSBO = scoreboard.getNullableObjective("isGameStarted");
290-
ScoreAccess scoreAccess = scoreboard.getOrCreateScore(() -> "gameStarted", respawnCountSBO);
306+
ScoreboardObjective gameStartedSBO = scoreboard.getNullableObjective("isGameStarted");
307+
ScoreAccess scoreAccess = scoreboard.getOrCreateScore(() -> "gameStarted", gameStartedSBO);
291308
scoreAccess.setScore(0);
309+
gameStatus = 0;
292310
}
293311

294312
private void useSkill(MinecraftServer server, ServerPlayerEntity player, int slot) {

src/main/java/xyz/lisbammisakait/item/LeitingzhizhangItem.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public void specialAbility(ItemStack stack, LivingEntity target, LivingEntity at
6262
stack.set(RtTPSComponents.HITNUMBER_TYPE,0);
6363
//给攻击者添加速度效果
6464
attacker.addStatusEffect(new StatusEffectInstance(StatusEffects.SPEED, SPEED_DURATION*20, SPEED_AMPLIFIER));
65-
ItemStack skillstack = player.getInventory().getStack(7);
65+
ItemStack skillstack = player.getInventory().getStack(8);
6666
RemainingCooldownGetter itemCooldownManager = (RemainingCooldownGetter) player.getItemCooldownManager();
6767
float cdr = (float) itemCooldownManager.getRemainingCooldown(skillstack) /20;
6868
// RelightTheThreePointStrategy.LOGGER.info("剩余冷却时间:"+cdr);
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package xyz.lisbammisakait.mixin;
2+
3+
import net.minecraft.client.network.ClientPlayerEntity;
4+
import net.minecraft.scoreboard.ScoreAccess;
5+
import net.minecraft.scoreboard.Scoreboard;
6+
import net.minecraft.scoreboard.ScoreboardObjective;
7+
import org.spongepowered.asm.mixin.Mixin;
8+
import org.spongepowered.asm.mixin.injection.At;
9+
import org.spongepowered.asm.mixin.injection.Inject;
10+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
11+
import xyz.lisbammisakait.RelightTheThreePointStrategy;
12+
13+
@Mixin(ClientPlayerEntity.class)
14+
public abstract class ClientPlayerEntityMixin {
15+
@Inject(at = @At("HEAD"), method = "dropSelectedItem(Z)Z", cancellable = true)
16+
private void dropSelectedItemCancel(boolean entireStack, CallbackInfoReturnable<Boolean> cir) {
17+
if(RelightTheThreePointStrategy.gameStatus==1||RelightTheThreePointStrategy.gameStatus==-1){
18+
// 取消丢弃物品
19+
cir.setReturnValue(false);
20+
}
21+
}
22+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package xyz.lisbammisakait.mixin;
2+
3+
import net.minecraft.entity.LivingEntity;
4+
import org.spongepowered.asm.mixin.Mixin;
5+
import org.spongepowered.asm.mixin.injection.At;
6+
import org.spongepowered.asm.mixin.injection.Inject;
7+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
8+
import xyz.lisbammisakait.RelightTheThreePointStrategy;
9+
10+
@Mixin(LivingEntity.class)
11+
public abstract class LivingEntityMixin {
12+
@Inject(method = "swapHandStacks", at = @At("HEAD"), cancellable = true)
13+
private void swapHandStacksPrevent(CallbackInfo ci){
14+
if(RelightTheThreePointStrategy.gameStatus==1||RelightTheThreePointStrategy.gameStatus==-1){
15+
// 取消
16+
ci.cancel();
17+
}
18+
19+
}
20+
}

src/main/java/xyz/lisbammisakait/skill/CaoCaoASkill.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,12 @@ public CaoCaoASkill(Settings settings) {
4141

4242
@Override
4343
public void processPracticalSkill(MinecraftServer server, ServerPlayerEntity serverplayer, ItemStack stack) {
44+
if (serverplayer.getItemCooldownManager().isCoolingDown(stack)) {
45+
// 如果物品正在冷却中,直接返回
46+
float cdr2 = serverplayer.getItemCooldownManager().getCooldownProgress(stack, 0.0F)*COOLDOWN;
47+
serverplayer.sendMessage(Text.of("剩余冷却时间:"+cdr2), true);
48+
return ;
49+
}
4450
teleportPlayersTowardsTarget(serverplayer, server.getWorld(serverplayer.getWorld().getRegistryKey()), DISTANCE);
4551
if (hasOtherPlayersNearby(serverplayer)) {
4652
float currentHealth = serverplayer.getHealth();

src/main/java/xyz/lisbammisakait/skill/ZhangJiaoASKill.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public ZhangJiaoASKill(Settings settings) {
3232
public void processPracticalSkill(MinecraftServer server, ServerPlayerEntity player, ItemStack stack) {
3333
if (player.getItemCooldownManager().isCoolingDown(stack)) {
3434
// 如果物品正在冷却中,直接返回
35-
float cdr2 = player.getItemCooldownManager().getCooldownProgress(stack, 0.0F)*40;
35+
float cdr2 = player.getItemCooldownManager().getCooldownProgress(stack, 0.0F)*COOLDOWN;
3636
player.sendMessage(Text.of("剩余冷却时间:"+cdr2), true);
3737
// client.player.sendMessage(Text.of("剩余冷却时间:"+cdr2), true);
3838
// user.sendMessage(Text.of("技能冷却中"), true);

0 commit comments

Comments
 (0)