From b6242d5de1bcdf2324227f1c80e8c91363fa5d31 Mon Sep 17 00:00:00 2001 From: Sen Date: Fri, 11 Jul 2025 15:39:08 +0200 Subject: [PATCH] add /set --- .../main/resources/textures/items/editor.png | Bin 1421 -> 4860 bytes .../java/common/init/SpeciesRegistry.java | 2 +- .../server/command/CommandEnvironment.java | 2 + .../server/command/commands/CommandSet.java | 87 ++++++++++++++++++ .../src/main/java/server/network/Player.java | 8 ++ 5 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 server/src/main/java/server/command/commands/CommandSet.java diff --git a/client/src/main/resources/textures/items/editor.png b/client/src/main/resources/textures/items/editor.png index 2cb6dd74246cb0cd20538d2672721a7ded5a2614..6271569e83aa677efa16bdb6f09ecbb04098c8d9 100755 GIT binary patch literal 4860 zcmeHLYfw|y77qA8qg=pJwPNKM#CKkYyh%hP5fCB~1oe1H2p8%}lx?5`|T({imNHDfY~P_vKU; zl%|-wM~zc*@@Fgw8LzRiR81Swv|VR|LwAmAd2!=ng|xJI@aWG|m;5V#4g1x@{Pv0w z_|H9FK?|>)O!nVI)E)H?I=^|ic*E?^(=Njkgf4NPRGFfpLPj>~5dD#Zt#dVh6wP~D zrh58(<;I2-^}yw|<(Ulb_&Qm}y@613wg1^Tan^*K0eRoG`{v5;tQojk*mOVX_O)kD z3%utZo7WOw)0}KQwC%|bigiNzzT_K^ssa|a?d>H&@aty$|v8_kh>v-ZsQZ<{s9 zee2HVwS!FvUm&GSqQTF~!*=W_kJk5a`jiUY_E<;zW1#r3E=T-qSNZLm|sQCt4y(Bb@oGM}|NB zG4>yk`_Gdmr>fl;RYQG$oZU3#(#UUoJl3*?WI64UB&Ivx6)jqYeLVD1g{`n+OGu^s z_YJ!A@HZeB~9JBy(z}I^>A*~=uOjqjSwq`C0%TjPuxH5 zYu3`}p`0X~fWdEex z&?VC--4jpOr`F~bMINIcWn8asl^u&fQogXPyJ0wlEt*tXxZ;*G)$LwSwzPYtAfU26 zc|bt3uk>Vdc2D++gKD>3TMCu+XAW(Yc|^5vZj^pdbcar|1&;t)Vz*mZG*%mPXtMxG1VWn!~|Z#LtoLprc)pXgiwnpi={FsNN>a;7L7$?P$f2%1*Xg( zLqa2_6hw+=_fdc+5hacw3<5gcYPHg=el)!?md@n!`E&+MhhZu}P)&(C0$&4h?T0prl?__PM8^bNhv)TaW_gKk3%bS8~K*J|ngJxqke z0!aD-`b!U!9Q0{=ByQ51jVLa$;5x#mKLv)q@i&-_8b>-9O2;+07C=p4R^~fX28T*z zZ#?W0#HzFghZhk09VDSrz7^}8*z6;YbovJZ+~4rNgMOX60}N17sX(kp&Gzs@#UhG* zegURORhYnWt3doXEEq?qD3^g!Sxi3$m5*>>D#GToF%HH?c{sNpRjAHHAUYJcQvq_C z3h?;BJiea-5aN*f8ZZv^Pv~w~U zG(VPO#J(&7kPHwOvDYaeaM(dEf*>P~5PG9ruh)nu_K+aE=bK?E*iINiAYz2T0VxA! z3m9AhlPPDi1Z=*51y5tZ0!BZ)9#bh3{}F90miF0@sg4 zMR*F7%0N&i8$py9j^ppLoAgS;iWu?0SfC@&3Y4cqD`>J~p{Bfxw#MQ1RRDrfK~?-& zFnV9YbbHTuow1PqCryM7K))sf{CaJmd4XO?f71;6G_$vzzwy<#7JuUmfcnEE@1^et zxjxACUJASy_(OGlkn6n^crWmW>iWOQMSgpn!gb(RkQE%3+II{Z4-Q&`6=A_*(r){E ziEo7cf1sg;kk3pc63xecIoa|8EWqeOgi0kY_g#h!_n&GxfF%Ia_o3oIIq!V!<`Qxl z!*g~-yXO#I2=|nW$!OHax_X76IEjLXmw?}z+rY1#2 zeScEYJ~`ec%qb^u`PGZTUc)qEJGlj;PEKZg1z*2(kFITf)P^2>R=gYB+`bD!1s>^X|@Uq0{mG WQ6pE)>hK2fl0qeO#Rq3COZ_i6(L5gj delta 1381 zcmV-r1)BQ&C5;P^B!5?WR9JLUVRs;Ka&Km7Y-J#Hd2nSQWq4_3004N}y_acn1FH^& z|7#U@2?&X4IgC|z2XFcJK+~OgNGf(xuPK|MK^*i6u&Mv=-$DQ2v8;P7SPZ`7oJHnGBqNXbwi3~ak>~X$ zi;92lJGzQ@&bvx?zB75Z%dIQO_}#(Z`DnMZyK9$g8hcOeocZR378A_p=acWoXmN~w ztS+mEr#$UNoqtPNC3Gw>C2N>R3ivpb!%7J$Vu=;R8fX@zN}Slj+k=%GXCB;FUb#Y| z+HM1KYpa#j7A4qZt4sts6Av3CNh8p)QbA47Y%eXm=1pt9$`La+Mo-HyHYq+Nde-<( zx(tmmLzmga%U954XG}xJBsag&3qW{mpStDWmFQF4n14@T1q9u4bHoC(DTj&T_#?Jt zaTfG*M#&sogG1W};3CZJAch45jAwD|*#v6?GyE9ACquavwFLy&Iop^9*ob(*!EV6Z z7!!E)way;RI9dS0iI)I0NitxmI>b-Vh#1OFoRV|SyWpZrE_?Cno%cTYc}C?RL4ylE zgb+gtIe$vj=%SAy#+YJGHVKX}mwXD8VoE7zOqyXjV{}H3oQo||w7B9+D6yoHE5fI0 zb=B8UV@)+T+oWOpH{Sxa*iy@#J3^^zcis2UV^2K~#M+Rd!wo;eh$D@BQQK5+sqr1T z@2T;oHi_x#7e1(=IfT;$&*Q{RW*}yjK|D+X2!CihnVHC{c9NUSOqvInv!KRq!f8B- zfuMG_Zt%tKgWR{=$mvVm>{sMyqWcSSG|_ExkKCS6YkA!$vH;CpIDKkl;9x_C9iaZRheM@Q$(H!k!O;||9wrktN*e3YF^M*QlCi4rGayYo- zmdNe!Ag&TQ4_@ zQE)p27sNujVu5ag;TJg_+KSy`Do(N>x$i3C6u+HhZ|31udWb{!>%rJX@o*f??IrH) z*bv}9-d;C3eeKt}R}V>z>(F+_LLG^vy3<#+&e)(Ex-IR_9S*Oj$sZ}CpOe2;*ni8e z8W6|TLhany$-EGLk2$>*j^BtPsQMF8^y<<06-#;!^L179&Vl{RRrCSycdmN(7I|b!V_;|siDzK=u?t0>k&qV{7#J8%yL@NRRE8KLCd9x{x1x`M;aX!6 zBS9AwF??qfW?*JelV@P4TUyH?CPZTNEo9*NzpRz!{eM>&6EHD)JaZF{DuFa00000NkvXXu0mjfdFG?N diff --git a/common/src/main/java/common/init/SpeciesRegistry.java b/common/src/main/java/common/init/SpeciesRegistry.java index 68c38edd..67f11b65 100755 --- a/common/src/main/java/common/init/SpeciesRegistry.java +++ b/common/src/main/java/common/init/SpeciesRegistry.java @@ -97,7 +97,7 @@ public abstract class SpeciesRegistry { registerSpecies("Elf", EntityElf.class, "gharoth", "Elbe", 0x054100, 0xd2d2d2, ":highelf", "Thranduil", 0x82888b, 0xeae7bd); registerSpecies("WoodElf", EntityWoodElf.class, "gharoth", "Waldelbe", 0x054100, 0x00bb00); registerSpecies("BloodElf", EntityBloodElf.class, "kyroth", "Blutelbe", 0x054100, 0x960000); - registerSpecies("Human", EntityHuman.class, EntityHuman.ClassType.class, "terra", "NSC", 0x4f7d9a, 0x034c7a, + registerSpecies("Human", EntityHuman.class, EntityHuman.ClassType.class, "terra", "Mensch", 0x4f7d9a, 0x034c7a, EntityHuman.ClassType.KNIGHT, ":knight_1", ":knight_2", ":knight_3", ":knight_4", ":knight_5", ":knight_6", ":knight_7", ":knight_8", EntityHuman.ClassType.PEASANT, diff --git a/server/src/main/java/server/command/CommandEnvironment.java b/server/src/main/java/server/command/CommandEnvironment.java index cb2b63b2..df7cea16 100644 --- a/server/src/main/java/server/command/CommandEnvironment.java +++ b/server/src/main/java/server/command/CommandEnvironment.java @@ -279,5 +279,7 @@ public class CommandEnvironment { this.registerExecutable(new CommandEffect()); this.registerExecutable(new CommandExterminatus()); this.registerExecutable(new CommandReset()); + + this.registerExecutable(new CommandSet()); } } diff --git a/server/src/main/java/server/command/commands/CommandSet.java b/server/src/main/java/server/command/commands/CommandSet.java new file mode 100644 index 00000000..dc239a44 --- /dev/null +++ b/server/src/main/java/server/command/commands/CommandSet.java @@ -0,0 +1,87 @@ +package server.command.commands; + +import java.util.Collection; + +import common.block.Block; +import common.collect.Iterables; +import common.collect.Lists; +import common.init.BlockRegistry; +import common.tags.TagObject; +import common.tileentity.TileEntity; +import common.util.BlockPos.MutableBlockPos; +import common.world.State; +import server.command.Command; +import server.command.CommandEnvironment; +import server.command.Executor; +import server.command.RunException; +import server.command.StringCompleter; +import server.network.Player; +import server.world.WorldServer; + +public class CommandSet extends Command { + public CommandSet() { + super("set"); + + this.setParamsOptional(); + this.addString("block", false, new StringCompleter() { + public Collection complete(CommandEnvironment env, String last) { + int idx = last.indexOf(','); + if(idx >= 0) { + Block block = BlockRegistry.byNameExact(last.substring(0, idx)); + if(block != null) + return Lists.newArrayList(Iterables.transform(block.getSavedStates(), state -> BlockRegistry.getName(state))); + } + return BlockRegistry.getKeys(); + } + }); + this.addTag("tag", 't'); + } + + public Object exec(CommandEnvironment env, Executor exec, String block, TagObject tag) { + if(!exec.isPlayer() || ((Player)exec).getPresentEntity() == null) + throw new RunException("Nur Spieler können diesen Befehl ausführen"); + Player player = (Player)exec; + Iterable blocks = player.getSelectedBlocks(); + if(blocks == null) + throw new RunException("Es ist keine Auswahl vorhanden"); + State state; + if(block == null) { + if(player.getPresentEntity().getHeldItem() == null) + throw new RunException("Es befindet sich kein Gegenstand in der Hand"); + else if(player.getPresentEntity().getHeldItem().getItem().getBlock() == null) + throw new RunException("Der Gegenstand in der Hand ist kein Block"); + state = player.getPresentEntity().getHeldItem().getItem().getBlock().getState(); + } + else { + state = BlockRegistry.byName(block, null); + if(state == null) + throw new RunException("Block '%s' existiert nicht", block); + } + WorldServer world = (WorldServer)player.getPresentEntity().getServerWorld(); + int changed = 0; + for(MutableBlockPos pos : blocks) { + boolean success = world.setState(pos, state); + if(tag != null) { + TileEntity tile = world.getTileEntity(pos); + if(tile != null) { + TagObject te = new TagObject(); + tile.writeTags(te); + te.merge(tag); + TileEntity newTile = TileEntity.createAndLoadEntity(world, world.getChunk(pos), pos, te); + if(newTile != null) { + world.removeTileEntity(pos); + world.setTileEntity(pos, newTile); + success = true; + } + } + } + if(success) + ++changed; + } + if(changed > 0) + exec.log("%d * %s platziert", changed, state.getBlock().getDisplay()); + else + exec.log("Es wurden keine Blöcke verändert"); + return changed; + } +} diff --git a/server/src/main/java/server/network/Player.java b/server/src/main/java/server/network/Player.java index 112b1a0f..dbdf327d 100755 --- a/server/src/main/java/server/network/Player.java +++ b/server/src/main/java/server/network/Player.java @@ -106,6 +106,7 @@ import common.tileentity.TileEntity; import common.tileentity.TileEntityDevice; import common.tileentity.TileEntitySign; import common.util.BlockPos; +import common.util.BlockPos.MutableBlockPos; import common.util.BoundingBox; import common.util.ChunkPos; import common.util.ExtMath; @@ -1486,6 +1487,13 @@ public class Player extends User implements Executor, IPlayer return newValue; } + public Iterable getSelectedBlocks() { + if(this.selectionDim == Integer.MIN_VALUE || this.selectionDim != UniverseRegistry.getId(this.entity.worldObj.dimension) || + this.selPos1 == null || this.selPos2 == null) + return null; + return BlockPos.getAllInBoxMutable(this.selPos1, this.selPos2); + } + private boolean copyClipboard() { if(this.selectionDim == Integer.MIN_VALUE || this.selectionDim != UniverseRegistry.getId(this.entity.worldObj.dimension) || this.selPos1 == null || this.selPos2 == null)