2020import net .minecraft .entity .player .PlayerInventory ;
2121import net .minecraft .inventory .Inventory ;
2222import net .minecraft .item .ItemStack ;
23+ import net .minecraft .network .packet .s2c .play .GameStateChangeS2CPacket ;
2324import net .minecraft .scoreboard .ScoreAccess ;
2425import net .minecraft .scoreboard .Scoreboard ;
2526import net .minecraft .scoreboard .ScoreboardCriterion ;
4647import xyz .lisbammisakait .network .packet .SkillSlotPayload ;
4748import xyz .lisbammisakait .skill .ActiveSkillable ;
4849import xyz .lisbammisakait .tools .Pile ;
49-
5050import java .util .Collection ;
5151import java .util .Collections ;
5252import java .util .concurrent .atomic .AtomicInteger ;
53-
5453import static xyz .lisbammisakait .skill .MarkItem .MARKSLOT ;
5554import 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 ) {
0 commit comments