diff --git a/patches/net/minecraft/server/management/PlayerList.java.patch b/patches/net/minecraft/server/management/PlayerList.java.patch index 6c80d1f1..3c38849e 100644 --- a/patches/net/minecraft/server/management/PlayerList.java.patch +++ b/patches/net/minecraft/server/management/PlayerList.java.patch @@ -19,7 +19,18 @@ nethandlerplayserver.sendPacket(new SPacketJoinGame(playerIn.getEntityId(), playerIn.interactionManager.getGameType(), worldinfo.isHardcore(), worldserver.dimension.getType(), worldserver.getDifficulty(), this.getMaxPlayers(), worldinfo.getTerrainType(), worldserver.getGameRules().getBoolean("reducedDebugInfo"))); nethandlerplayserver.sendPacket(new SPacketCustomPayload(SPacketCustomPayload.BRAND, (new PacketBuffer(Unpooled.buffer())).writeString(this.getServer().getServerModName()))); nethandlerplayserver.sendPacket(new SPacketServerDifficulty(worldinfo.getDifficulty(), worldinfo.isDifficultyLocked())); -@@ -460,6 +464,12 @@ +@@ -312,6 +316,10 @@ + { + nbttagcompound1 = this.playerDataManager.readPlayerData(playerIn); + } ++ if (playerIn instanceof EntityPlayerMPFake) ++ { ++ ((EntityPlayerMPFake) playerIn).fixStartingPosition.run(); ++ } + + return nbttagcompound1; + } +@@ -460,6 +468,12 @@ for (EntityPlayerMP entityplayermp1 : list) { diff --git a/src/main/java/carpet/CarpetServer.java b/src/main/java/carpet/CarpetServer.java index e35c8c37..714effb7 100644 --- a/src/main/java/carpet/CarpetServer.java +++ b/src/main/java/carpet/CarpetServer.java @@ -75,6 +75,8 @@ public static void registerCarpetCommands(CommandDispatcher dispa LogCommand.register(dispatcher); SpawnCommand.register(dispatcher); PlayerCommand.register(dispatcher); + CameraModeCommand.register(dispatcher); + InfoCommand.register(dispatcher); TestCommand.register(dispatcher); } diff --git a/src/main/java/carpet/CarpetSettings.java b/src/main/java/carpet/CarpetSettings.java index 8020ed81..6953c925 100644 --- a/src/main/java/carpet/CarpetSettings.java +++ b/src/main/java/carpet/CarpetSettings.java @@ -203,13 +203,16 @@ private static void set_defaults() rule("commandLog", "commands", "Enables /log command to monitor events in the game via chat and overlays").defaultTrue(), //rule("commandDistance", "commands", "Enables /distance command to measure in game distance between points").defaultTrue() // .extraInfo("Also enables brown carpet placement action if 'carpets' rule is turned on as well"), + rule("commandInfo", "commands", "Enables /info command for blocks and entities").defaultTrue() + .extraInfo("Also enables gray carpet placement action if 'carpets' rule is turned on as well"), + //rule("commandBlockInfo", "commands", "Enables /blockinfo command").defaultTrue() // .extraInfo("Also enables gray carpet placement action if 'carpets' rule is turned on as well"), //rule("commandEntityInfo", "commands", "Enables /entityinfo command").defaultTrue() // .extraInfo("Also enables yellow carpet placement action if 'carpets' rule is turned on as well"), //rule("commandUnload", "commands", "Enables /unload command to control game speed").defaultTrue(), - //rule("commandCameramode", "commands", "Enables /c and /s commands to quickly switch between camera and survival modes").defaultTrue() - // .extraInfo("/c and /s commands are available to all players regardless of their permission levels"), + rule("commandCameramode", "commands", "Enables /c and /s commands to quickly switch between camera and survival modes").defaultTrue() + .extraInfo("/c and /s commands are available to all players regardless of their permission levels"), //rule("commandPerimeterInfo", "commands", "Enables /perimeterinfo command that scans the area around the block for potential spawnable spots").defaultTrue(), rule("commandPlayer", "commands", "Enables /player command to control/spawn players").defaultTrue(), //rule("commandRNG", "commands", "Enables /rng command to manipulate and query rng").defaultTrue(), diff --git a/src/main/java/carpet/commands/CameraModeCommand.java b/src/main/java/carpet/commands/CameraModeCommand.java new file mode 100644 index 00000000..83ff2302 --- /dev/null +++ b/src/main/java/carpet/commands/CameraModeCommand.java @@ -0,0 +1,69 @@ +package carpet.commands; + +import carpet.CarpetSettings; +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import net.minecraft.command.CommandSource; +import net.minecraft.command.ISuggestionProvider; +import net.minecraft.command.arguments.EntityArgument; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.MobEffects; +import net.minecraft.potion.PotionEffect; +import net.minecraft.world.GameType; + +import static com.mojang.brigadier.arguments.StringArgumentType.getString; +import static com.mojang.brigadier.arguments.StringArgumentType.word; +import static net.minecraft.command.Commands.argument; +import static net.minecraft.command.Commands.literal; + +public class CameraModeCommand +{ + public static void register(CommandDispatcher dispatcher) + { + LiteralArgumentBuilder camera = literal("c"). + requires((player) -> CarpetSettings.getBool("commandCameramode")). + executes((c) -> cameraMode(c.getSource(), c.getSource().asPlayer())). + then(argument("player", EntityArgument.singlePlayer()). + executes( (c) -> cameraMode(c.getSource(), EntityArgument.getOnePlayer(c, "player")))); + + LiteralArgumentBuilder survival = literal("s"). + requires((player) -> CarpetSettings.getBool("commandCameramode")). + executes((c) -> survivalMode( + c.getSource(), + c.getSource().asPlayer())). + then(argument("player", EntityArgument.singlePlayer()). + executes( (c) -> survivalMode(c.getSource(), EntityArgument.getOnePlayer(c, "player")))); + + dispatcher.register(camera); + dispatcher.register(survival); + } + private static boolean iCanHasPermissions(CommandSource source, EntityPlayer player) + { + try + { + return source.hasPermissionLevel(2) || source.asPlayer() == player; + } + catch (CommandSyntaxException e) + { + return true; // shoudn't happen because server has all permissions anyways + } + } + private static int cameraMode(CommandSource source, EntityPlayer player) + { + if (!(iCanHasPermissions(source, player))) return 0; + player.setGameType(GameType.SPECTATOR); + player.addPotionEffect(new PotionEffect(MobEffects.NIGHT_VISION, 999999, 0, false, false)); + player.addPotionEffect(new PotionEffect(MobEffects.CONDUIT_POWER, 999999, 0, false, false)); + return 1; + } + private static int survivalMode(CommandSource source, EntityPlayer player) + { + if (!(iCanHasPermissions(source, player))) return 0; + player.setGameType(GameType.SURVIVAL); + player.removePotionEffect(MobEffects.NIGHT_VISION); + player.removePotionEffect(MobEffects.CONDUIT_POWER); + return 1; + } + +} diff --git a/src/main/java/carpet/commands/InfoCommand.java b/src/main/java/carpet/commands/InfoCommand.java new file mode 100644 index 00000000..c6397a23 --- /dev/null +++ b/src/main/java/carpet/commands/InfoCommand.java @@ -0,0 +1,132 @@ +package carpet.commands; + +import carpet.CarpetSettings; +import carpet.utils.EntityInfo; +import carpet.utils.Messenger; +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import net.minecraft.command.CommandSource; +import net.minecraft.command.ISuggestionProvider; +import net.minecraft.command.arguments.BlockPosArgument; +import net.minecraft.command.arguments.EntityArgument; +import net.minecraft.command.arguments.EntitySelector; +import net.minecraft.entity.Entity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.ITextComponent; + +import javax.swing.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import static com.mojang.brigadier.arguments.StringArgumentType.getString; +import static com.mojang.brigadier.arguments.StringArgumentType.greedyString; +import static com.mojang.brigadier.arguments.StringArgumentType.word; +import static net.minecraft.command.Commands.argument; +import static net.minecraft.command.Commands.literal; + +public class InfoCommand +{ + public static void register(CommandDispatcher dispatcher) + { + LiteralArgumentBuilder command = literal("info"). + requires((player) -> CarpetSettings.getBool("commandCameramode")). + then(literal("block"). + then(argument("block position", BlockPosArgument.blockPos()). + executes( (c) -> infoBlock( + c.getSource(), + BlockPosArgument.getBlockPos(c, "block position"), null)). + then(literal("grep"). + then(argument("regexp",greedyString()). + executes( (c) -> infoBlock( + c.getSource(), + BlockPosArgument.getBlockPos(c, "block position"), + getString(c, "regexp"))))))). + then(literal("entity"). + then(argument("entity selector", EntityArgument.multipleEntities()). + executes( (c) -> infoEntities( + c.getSource(), EntityArgument.getEntities(c,"entity selector"), null)). + then(literal("grep"). + then(argument("regexp",greedyString()). + executes( (c) -> infoEntities( + c.getSource(), + EntityArgument.getEntities(c,"entity selector"), + getString(c, "regexp"))))))); + + dispatcher.register(command); + } + + public static void printEntity(List messages, CommandSource source, String grep) + { + List actual = new ArrayList<>(); + if (grep != null) + { + Pattern p = Pattern.compile(grep); + actual.add(messages.get(0)); + boolean empty = true; + for (int i = 1; i messages, CommandSource source, String grep) + { + Messenger.m(source, ""); + if (grep != null) + { + Pattern p = Pattern.compile(grep); + Messenger.m(source, messages.get(0)); + for (int i = 1; i entities, String grep) + { + for (Entity e: entities) + { + List report = EntityInfo.entityInfo(e, source.getWorld()); + printEntity(report, source, grep); + } + return 1; + } + private static int infoBlock(CommandSource source, BlockPos pos, String grep) + { + Messenger.m(source, "r Not done yet: check.... tomorrow"); + return 1; + } + +} diff --git a/src/main/java/carpet/patches/EntityPlayerMPFake.java b/src/main/java/carpet/patches/EntityPlayerMPFake.java index 52c2d116..45e8c3d6 100644 --- a/src/main/java/carpet/patches/EntityPlayerMPFake.java +++ b/src/main/java/carpet/patches/EntityPlayerMPFake.java @@ -8,6 +8,8 @@ import com.mojang.authlib.GameProfile; import net.minecraft.tileentity.TileEntitySkull; import net.minecraft.util.DamageSource; + import net.minecraft.util.math.Vec2f; + import net.minecraft.util.math.Vec3d; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.WorldServer; import net.minecraft.entity.player.EntityPlayerMP; @@ -16,8 +18,12 @@ import net.minecraft.world.GameType; import net.minecraft.world.dimension.DimensionType; + import java.util.function.BiConsumer; + public class EntityPlayerMPFake extends EntityPlayerMP { + public Runnable fixStartingPosition = () -> {}; + public static EntityPlayerMPFake createFake(String username, MinecraftServer server, double d0, double d1, double d2, double yaw, double pitch, DimensionType dimension, GameType gamemode) { //prolly half of that crap is not necessary, but it works @@ -29,7 +35,7 @@ public static EntityPlayerMPFake createFake(String username, MinecraftServer ser gameprofile = TileEntitySkull.updateGameProfile(gameprofile); } EntityPlayerMPFake instance = new EntityPlayerMPFake(server, worldIn, gameprofile, interactionManagerIn); - instance.setLocationAndAngles(d0, d1, d2, (float)yaw, (float)pitch); + instance.fixStartingPosition = () -> instance.setLocationAndAngles(d0, d1, d2, (float)yaw, (float)pitch); server.getPlayerList().initializeConnectionToPlayer(new NetworkManagerFake(EnumPacketDirection.CLIENTBOUND), instance); if (instance.dimension != dimension) //player was logged in in a different dimension { diff --git a/src/main/java/carpet/utils/EntityInfo.java b/src/main/java/carpet/utils/EntityInfo.java index 1ceee9af..a03c0e04 100644 --- a/src/main/java/carpet/utils/EntityInfo.java +++ b/src/main/java/carpet/utils/EntityInfo.java @@ -25,8 +25,11 @@ import net.minecraft.potion.PotionEffect; import net.minecraft.util.math.BlockPos; import net.minecraft.util.registry.IRegistry; +import net.minecraft.util.text.ITextComponent; import net.minecraft.world.World; +import net.minecraft.world.WorldServer; +import javax.swing.*; import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -59,7 +62,7 @@ private static String display_item(ItemStack item) { return null; } // func_190916_E() - String stackname = item.getCount()>1?String.format("%dx%s",item.getCount(), item.getDisplayName()):item.getDisplayName().getString(); + String stackname = item.getCount()>1?String.format("%dx%s",item.getCount(), item.getDisplayName().getString()):item.getDisplayName().getString(); if (item.isDamaged()) { stackname += String.format(" %d/%d", item.getMaxDamage()-item.getDamage(), item.getMaxDamage()); @@ -113,82 +116,79 @@ private static double get_horse_jump_percent(double internal) return 100*(internal-min)/(max-min); } - public static List entityInfo(Entity e, World ws) + public static List entityInfo(Entity e, World source_world) { - List lst = new ArrayList(); + List lst = new ArrayList<>(); World world = e.getEntityWorld(); - lst.add(entity_short_string(e)); - if (e.isPassenger()) { lst.add(String.format(" - Rides: %s", e.getRidingEntity().getDisplayName().getString())); } + lst.add(Messenger.c("w "+entity_short_string(e))); + if (e.isPassenger()) { lst.add(Messenger.c("w - Rides: ", "wb "+e.getRidingEntity().getDisplayName().getString())); } if (e.isBeingRidden()) { List passengers = e.getPassengers(); if (passengers.size() == 1) { - lst.add(String.format(" - Is being ridden by: %s", passengers.get(0).getDisplayName().getString())); + lst.add(Messenger.c("w - Is being ridden by: ", "wb "+passengers.get(0).getDisplayName().getString())); } else { - lst.add(" - Is being ridden by:"); + lst.add(Messenger.c("w - Is being ridden by:")); for (Entity ei: passengers) { - lst.add(String.format(" * %s", ei.getDisplayName().getString())); + lst.add(Messenger.c("wb * "+ ei.getDisplayName().getString())); } } } - lst.add(String.format(" - Height: %.2f, Width: %.2f, Eye height: %.2f",e.height, e.width, e.getEyeHeight())); - lst.add(String.format(" - Age: %s", makeTime(e.ticksExisted))); - if (ws.dimension.getType() != e.dimension) + lst.add(Messenger.c(String.format("w - Height: %.2f, Width: %.2f, Eye height: %.2f",e.height, e.width, e.getEyeHeight()))); + lst.add(Messenger.c("w - Age: ", "wb "+makeTime(e.ticksExisted))); + if (source_world.dimension.getType() != e.dimension) { - lst.add(String.format(" - Dimension: %s", e.dimension.toString())); + lst.add(Messenger.c("w - Dimension: ", "wb "+e.dimension.toString())); } - if (e.getFire() > 0) { lst.add(String.format(" - Fire for %d ticks",e.getFire())); } - if (e.isImmuneToFire() ) { lst.add(" - Immune to fire"); } - if (e.timeUntilPortal > 0) { lst.add(String.format(" - Portal cooldown for %d ticks",e.timeUntilPortal)); } - if (e.isInvulnerable()) { lst.add(" - Invulnerable"); } - if (e.isImmuneToExplosions()) { lst.add(" - Immune to explosions"); } + if (e.getFire() > 0) { lst.add(Messenger.c("w - Fire for ","wb "+e.getFire(),"w ticks")); } + if (e.isImmuneToFire() ) { lst.add(Messenger.c("w - Immune to fire")); } + if (e.timeUntilPortal > 0) { lst.add(Messenger.c("w - Portal cooldown for ","wb "+e.timeUntilPortal," ticks")); } + if (e.isInvulnerable()) { lst.add(Messenger.c("w - Invulnerable")); } + if (e.isImmuneToExplosions()) { lst.add(Messenger.c("w - Immune to explosions")); } if (e instanceof EntityItem) { EntityItem ei = (EntityItem)e; ItemStack stack = ei.getItem();// getEntityItem(); String stackname = stack.getCount()>1?String.format("%dx%s",stack.getCount(), stack.getDisplayName().getString()):stack.getDisplayName().getString(); - lst.add(String.format(" - Content: %s", stackname)); - lst.add(String.format(" - Despawn Timer: %s", makeTime(ei.getAge()))); + lst.add(Messenger.c("w - Content: ", "wb "+stackname)); + lst.add(Messenger.c("w - Despawn Timer: ", "wb "+makeTime(ei.getAge()))); } if (e instanceof EntityXPOrb) { EntityXPOrb exp = (EntityXPOrb)e; - lst.add(String.format(" - Despawn Timer: %s", makeTime(exp.xpOrbAge))); - lst.add(String.format(" - Xp Value: %s", exp.getXpValue())); + lst.add(Messenger.c("w - Despawn Timer: ", "wb "+makeTime(exp.xpOrbAge))); + lst.add(Messenger.c("w - Xp Value: ", "wb "+exp.getXpValue())); } if (e instanceof EntityItemFrame) { EntityItemFrame eif = (EntityItemFrame)e; - lst.add(String.format(" - Content: %s", eif.getDisplayedItem().getDisplayName())); - lst.add(String.format(" - Rotation: %d", eif.getRotation())); + lst.add(Messenger.c("w - Content: ", "wb "+eif.getDisplayedItem().getDisplayName())); + lst.add(Messenger.c("w - Rotation: ", "wb "+eif.getRotation())); } if (e instanceof EntityPainting) { EntityPainting ep = (EntityPainting)e; - lst.add(String.format(" - Art: %s", IRegistry.field_212620_i.getKey(ep.art).toString())); + lst.add(Messenger.c("w - Art: ", "wb "+IRegistry.field_212620_i.getKey(ep.art).toString())); } - - - if (e instanceof EntityLivingBase) { EntityLivingBase elb = (EntityLivingBase)e; - lst.add(String.format(" - Despawn timer: %s", makeTime(elb.getIdleTime()))); + lst.add(Messenger.c("w - Despawn timer: ", "wb "+makeTime(elb.getIdleTime()))); - lst.add(String.format(" - Health: %.2f/%.2f", elb.getHealth(), elb.getMaxHealth())); + lst.add(Messenger.c(String.format("w - Health: %.2f/%.2f", elb.getHealth(), elb.getMaxHealth()))); if (elb.getAttribute(SharedMonsterAttributes.ARMOR).getValue() > 0.0) { - lst.add(String.format(" - Armour: %.1f",elb.getAttribute(SharedMonsterAttributes.ARMOR).getValue())); + lst.add(Messenger.c(String.format("w - Armour: %.1f",elb.getAttribute(SharedMonsterAttributes.ARMOR).getValue()))); } if (elb.getAttribute(SharedMonsterAttributes.ARMOR_TOUGHNESS).getValue() > 0.0) { - lst.add(String.format(" - Toughness: %.1f",elb.getAttribute(SharedMonsterAttributes.ARMOR_TOUGHNESS).getValue())); + lst.add(Messenger.c(String.format("w - Toughness: %.1f",elb.getAttribute(SharedMonsterAttributes.ARMOR_TOUGHNESS).getValue()))); } //lst.add(String.format(" - Base speed: %.1fb/s",get_speed(elb.getEntityAttribute(SharedMonsterAttributes.MOVEMENT_SPEED).getAttributeValue()))); @@ -197,24 +197,24 @@ public static List entityInfo(Entity e, World ws) Collection potions = elb.getActivePotionEffects(); if (!potions.isEmpty()) { - lst.add(" - Potion effects:"); + lst.add(Messenger.c("w - Potion effects:")); for (PotionEffect pe : potions) { - lst.add(String.format(" * %s%s %s", + lst.add(Messenger.c(String.format("w * %s%s %s", pe.getEffectName().substring(7), (pe.getAmplifier()>1)?String.format("x%d",pe.getAmplifier()):"", - makeTime(pe.getDuration()))); + makeTime(pe.getDuration())))); } } ItemStack mainhand = elb.getHeldItemMainhand(); if (!(mainhand.isEmpty())) { - lst.add(String.format(" - Main hand: %s", display_item(mainhand))); + lst.add(Messenger.c("w - Main hand: ", "wb "+display_item(mainhand))); } ItemStack offhand = elb.getHeldItemOffhand(); if (!(offhand.isEmpty())) { - lst.add(String.format(" - Off hand: %s", display_item(offhand))); + lst.add(Messenger.c("w - Off hand: ", "wb "+display_item(offhand))); } String armour = ""; for (ItemStack armourpiece: elb.getArmorInventoryList()) @@ -226,40 +226,47 @@ public static List entityInfo(Entity e, World ws) } if (!("".equals(armour))) { - lst.add(String.format(" - Armour:%s", armour)); + lst.add(Messenger.c("w - Armour:"+ armour)); } if (e instanceof EntityLiving) { EntityLiving el = (EntityLiving)elb; - lst.add(String.format(" - Follow range: %.1f",el.getAttribute(SharedMonsterAttributes.FOLLOW_RANGE).getValue())); + lst.add(Messenger.c(String.format("w - Follow range: %.1f",el.getAttribute(SharedMonsterAttributes.FOLLOW_RANGE).getValue()))); - lst.add(String.format(" - Movement speed factor: %.2f",el.getMoveHelper().getSpeed())); + lst.add(Messenger.c(String.format("w - Movement speed factor: %.2f",el.getMoveHelper().getSpeed()))); EntityLivingBase target_elb = el.getAttackTarget(); if (target_elb != null) { - lst.add(String.format(" - Attack target: %s", entity_short_string(target_elb))); + lst.add(Messenger.c("w - Attack target: ", "wb "+entity_short_string(target_elb))); } if (el.canPickUpLoot()) { - lst.add(" - Can pick up loot"); + lst.add(Messenger.c("w - Can pick up loot")); } if (el.isNoDespawnRequired()) { - lst.add(" - Won't despawn"); + lst.add((Messenger.c("w - Won't despawn"))); } if (e instanceof EntityWither) { EntityWither ew = (EntityWither)e; Entity etarget = world.getEntityByID(ew.getWatchedTargetId(0)); - lst.add(String.format(" - Head 1 target: %s", entity_short_string(etarget) )); + lst.add(Messenger.c("w - Head 1 target: ", "wb "+entity_short_string(etarget) )); etarget = world.getEntityByID(ew.getWatchedTargetId(1)); - lst.add(String.format(" - Head 2 target: %s", entity_short_string(etarget) )); + lst.add(Messenger.c("w - Head 2 target: ", "wb "+entity_short_string(etarget) )); etarget = world.getEntityByID(ew.getWatchedTargetId(2)); - lst.add(String.format(" - Head 3 target: %s", entity_short_string(etarget) )); + lst.add(Messenger.c("w - Head 3 target: ", "wb "+entity_short_string(etarget) )); } + + + } + } + /* + + if (e instanceof EntityCreature) { EntityCreature ec = (EntityCreature) e; @@ -334,6 +341,7 @@ public static List entityInfo(Entity e, World ws) } } } + */ return lst; } @@ -342,7 +350,7 @@ static void issue_entity_info(EntityPlayer player) { try { - player.getServer().getCommandManager().handleCommand (player.getCommandSource(), "entityinfo @e[r=5,c=5,type=!player]"); // TODO fix command call + player.getServer().getCommandManager().handleCommand (player.getCommandSource(), "info entity @e[r=5,c=5,type=!player]"); // TODO fix command call } catch (Throwable ignored) {