Skip to content

Commit a93aafe

Browse files
committed
Add target block/entity expressions
1 parent b570103 commit a93aafe

File tree

3 files changed

+132
-0
lines changed

3 files changed

+132
-0
lines changed

src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/ExpressionHandler.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,12 @@
66
import com.github.skriptdev.skript.plugin.elements.expressions.block.ExprBlockTypeAtLocation;
77
import com.github.skriptdev.skript.plugin.elements.expressions.block.ExprBlockTypeOfBlock;
88
import com.github.skriptdev.skript.plugin.elements.expressions.block.ExprBlockFluidLevel;
9+
import com.github.skriptdev.skript.plugin.elements.expressions.block.ExprTargetBlockOfPlayer;
910
import com.github.skriptdev.skript.plugin.elements.expressions.entity.ExprEntityHealth;
1011
import com.github.skriptdev.skript.plugin.elements.expressions.entity.ExprEntityStat;
1112
import com.github.skriptdev.skript.plugin.elements.expressions.entity.ExprNPCType;
1213
import com.github.skriptdev.skript.plugin.elements.expressions.entity.ExprName;
14+
import com.github.skriptdev.skript.plugin.elements.expressions.entity.ExprTargetEntityOfEntity;
1315
import com.github.skriptdev.skript.plugin.elements.expressions.item.ExprInventory;
1416
import com.github.skriptdev.skript.plugin.elements.expressions.item.ExprItemContainer;
1517
import com.github.skriptdev.skript.plugin.elements.expressions.item.ExprItemStack;
@@ -44,12 +46,14 @@ public static void register(SkriptRegistration registration) {
4446
ExprBlockFluidLevel.register(registration);
4547
ExprBlockTypeAtLocation.register(registration);
4648
ExprBlockTypeOfBlock.register(registration);
49+
ExprTargetBlockOfPlayer.register(registration);
4750

4851
// ENTITY
4952
ExprEntityHealth.register(registration);
5053
ExprEntityStat.register(registration);
5154
ExprName.register(registration);
5255
ExprNPCType.register(registration);
56+
ExprTargetEntityOfEntity.register(registration);
5357

5458
// ITEM
5559
ExprInventory.register(registration);
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package com.github.skriptdev.skript.plugin.elements.expressions.block;
2+
3+
import com.github.skriptdev.skript.api.hytale.Block;
4+
import com.github.skriptdev.skript.api.skript.registration.SkriptRegistration;
5+
import com.hypixel.hytale.component.Ref;
6+
import com.hypixel.hytale.component.Store;
7+
import com.hypixel.hytale.math.vector.Vector3i;
8+
import com.hypixel.hytale.server.core.entity.entities.Player;
9+
import com.hypixel.hytale.server.core.universe.world.World;
10+
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
11+
import com.hypixel.hytale.server.core.util.TargetUtil;
12+
import io.github.syst3ms.skriptparser.lang.Expression;
13+
import io.github.syst3ms.skriptparser.lang.TriggerContext;
14+
import io.github.syst3ms.skriptparser.parsing.ParseContext;
15+
import org.jetbrains.annotations.NotNull;
16+
17+
import java.util.Optional;
18+
19+
public class ExprTargetBlockOfPlayer implements Expression<Block> {
20+
21+
public static void register(SkriptRegistration reg) {
22+
reg.newExpression(ExprTargetBlockOfPlayer.class, Block.class, true,
23+
"target block of %player%")
24+
.name("Target Block of Player")
25+
.description("Returns the block the player is looking at.")
26+
.examples("set {_block} to target block of player")
27+
.since("INSERT VERSION")
28+
.register();
29+
}
30+
31+
private Expression<Player> player;
32+
33+
@SuppressWarnings("unchecked")
34+
@Override
35+
public boolean init(Expression<?>[] expressions, int matchedPattern, @NotNull ParseContext parseContext) {
36+
this.player = (Expression<Player>) expressions[0];
37+
return true;
38+
}
39+
40+
@Override
41+
public Block[] getValues(@NotNull TriggerContext ctx) {
42+
Optional<? extends Player> single = this.player.getSingle(ctx);
43+
if (single.isEmpty()) return null;
44+
45+
Player player = single.get();
46+
Ref<EntityStore> ref = player.getReference();
47+
World world = player.getWorld();
48+
if (world == null || ref == null) return null;
49+
50+
Store<EntityStore> store = world.getEntityStore().getStore();
51+
52+
// TODO configurable maxDistance
53+
Vector3i targetBlock = TargetUtil.getTargetBlock(ref, 50, store);
54+
if (targetBlock == null) return null;
55+
return new Block[]{new Block(world, targetBlock)};
56+
}
57+
58+
@Override
59+
public String toString(@NotNull TriggerContext ctx, boolean debug) {
60+
return "target block of " + this.player.toString(ctx, debug);
61+
}
62+
63+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package com.github.skriptdev.skript.plugin.elements.expressions.entity;
2+
3+
import com.github.skriptdev.skript.api.skript.registration.SkriptRegistration;
4+
import com.hypixel.hytale.component.Ref;
5+
import com.hypixel.hytale.component.Store;
6+
import com.hypixel.hytale.server.core.entity.Entity;
7+
import com.hypixel.hytale.server.core.entity.EntityUtils;
8+
import com.hypixel.hytale.server.core.universe.world.World;
9+
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
10+
import com.hypixel.hytale.server.core.util.TargetUtil;
11+
import io.github.syst3ms.skriptparser.lang.Expression;
12+
import io.github.syst3ms.skriptparser.lang.TriggerContext;
13+
import io.github.syst3ms.skriptparser.parsing.ParseContext;
14+
import org.jetbrains.annotations.NotNull;
15+
16+
import java.util.Optional;
17+
18+
public class ExprTargetEntityOfEntity implements Expression<Entity> {
19+
20+
public static void register(SkriptRegistration reg) {
21+
reg.newExpression(ExprTargetEntityOfEntity.class, Entity.class, true,
22+
"target entity of %entity%")
23+
.name("Target Entity of Entity")
24+
.description("Returns the target entity of the given entity.")
25+
.examples("set {_target} to target entity of player")
26+
.since("INSERT VERSION")
27+
.register();
28+
}
29+
30+
private Expression<Entity> entity;
31+
32+
@SuppressWarnings("unchecked")
33+
@Override
34+
public boolean init(Expression<?>[] expressions, int matchedPattern, @NotNull ParseContext parseContext) {
35+
this.entity = (Expression<Entity>) expressions[0];
36+
return true;
37+
}
38+
39+
@SuppressWarnings("deprecation")
40+
@Override
41+
public Entity[] getValues(@NotNull TriggerContext ctx) {
42+
Optional<? extends Entity> single = this.entity.getSingle(ctx);
43+
if (single.isEmpty()) return null;
44+
45+
Entity entity = single.get();
46+
Ref<EntityStore> ref = entity.getReference();
47+
World world = entity.getWorld();
48+
if (world == null || ref == null) return null;
49+
50+
Store<EntityStore> store = world.getEntityStore().getStore();
51+
Ref<EntityStore> targetEntity = TargetUtil.getTargetEntity(ref, store);
52+
if (targetEntity == null || !targetEntity.isValid()) return null;
53+
54+
// TODO better handling of this deprecation
55+
Entity target = EntityUtils.getEntity(targetEntity, store);
56+
57+
return new Entity[]{target};
58+
}
59+
60+
@Override
61+
public String toString(@NotNull TriggerContext ctx, boolean debug) {
62+
return "target entity of " + this.entity.toString(ctx, debug);
63+
}
64+
65+
}

0 commit comments

Comments
 (0)