Allow Spells to Affect Blocks Add Cooling Spell
This commit is contained in:
parent
b88132eb29
commit
07d1d44f52
@ -1,5 +1,9 @@
|
||||
### Changelog
|
||||
|
||||
**1.0.11**
|
||||
* Allow Spells to Affect Blocks
|
||||
* Add Cooling Spell
|
||||
|
||||
**1.0.10**
|
||||
* Add Issues Link
|
||||
|
||||
|
@ -59,6 +59,7 @@ You can apply Spells to blank or existing Spells in the Casting Table. Doing so
|
||||
| Steadfast | 1 | Prevents Spell from rebounding. |
|
||||
| Teleport | 2 | Teleports target to random location. |
|
||||
| Inward | 1 | Causes the Spell to target the player. If the Spell fails instead of rebounding, it will just do nothing. |
|
||||
| Cooling | 1 | Extinguish the target if they are on fire. |
|
||||
|
||||
## ```/spell``` Command
|
||||
This command requires OP permissions.
|
||||
|
@ -10,7 +10,7 @@ org.gradle.jvmargs = -Xmx1G
|
||||
loader_version = 0.7.8+build.186
|
||||
|
||||
# Mod Properties
|
||||
mod_version = 1.0.10
|
||||
mod_version = 1.0.11
|
||||
maven_group = com.thebrokenrail
|
||||
archives_base_name = sorcerycraft
|
||||
|
||||
|
@ -1,21 +1,21 @@
|
||||
package com.thebrokenrail.sorcerycraft.client.entity;
|
||||
|
||||
import com.thebrokenrail.sorcerycraft.entity.SpellEntity;
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
import net.minecraft.client.render.entity.EntityRenderDispatcher;
|
||||
import net.minecraft.client.render.entity.EntityRenderer;
|
||||
import net.minecraft.container.PlayerContainer;
|
||||
import net.minecraft.entity.AreaEffectCloudEntity;
|
||||
import net.minecraft.util.Identifier;
|
||||
|
||||
@Environment(EnvType.CLIENT)
|
||||
public class SpellEntityRenderer extends EntityRenderer<AreaEffectCloudEntity> {
|
||||
public class SpellEntityRenderer extends EntityRenderer<SpellEntity> {
|
||||
public SpellEntityRenderer(EntityRenderDispatcher entityRenderDispatcher) {
|
||||
super(entityRenderDispatcher);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Identifier getTexture(AreaEffectCloudEntity areaEffectCloudEntity) {
|
||||
public Identifier getTexture(SpellEntity spellEntity) {
|
||||
return PlayerContainer.BLOCK_ATLAS_TEXTURE;
|
||||
}
|
||||
}
|
@ -5,8 +5,6 @@ import com.thebrokenrail.sorcerycraft.spell.registry.Spell;
|
||||
import com.thebrokenrail.sorcerycraft.spell.registry.SpellRegistry;
|
||||
import com.thebrokenrail.sorcerycraft.spell.util.SpellTag;
|
||||
import com.thebrokenrail.sorcerycraft.spell.registry.Spells;
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.EntityType;
|
||||
import net.minecraft.entity.LivingEntity;
|
||||
@ -16,12 +14,12 @@ import net.minecraft.item.Item;
|
||||
import net.minecraft.network.Packet;
|
||||
import net.minecraft.network.packet.s2c.play.EntitySpawnS2CPacket;
|
||||
import net.minecraft.particle.ParticleTypes;
|
||||
import net.minecraft.server.command.ParticleCommand;
|
||||
import net.minecraft.server.network.ServerPlayerEntity;
|
||||
import net.minecraft.server.world.ServerWorld;
|
||||
import net.minecraft.sound.SoundCategory;
|
||||
import net.minecraft.sound.SoundEvents;
|
||||
import net.minecraft.util.Identifier;
|
||||
import net.minecraft.util.hit.BlockHitResult;
|
||||
import net.minecraft.util.hit.EntityHitResult;
|
||||
import net.minecraft.util.hit.HitResult;
|
||||
import net.minecraft.world.World;
|
||||
@ -39,8 +37,6 @@ public class SpellEntity extends ThrownItemEntity {
|
||||
super(SorceryCraft.SPELL_ENTITY, owner, world);
|
||||
}
|
||||
|
||||
private boolean firstTick = true;
|
||||
|
||||
public SpellEntity(World world, double x, double y, double z) {
|
||||
super(SorceryCraft.SPELL_ENTITY, x, y, z, world);
|
||||
}
|
||||
@ -51,19 +47,21 @@ public class SpellEntity extends ThrownItemEntity {
|
||||
|
||||
@Override
|
||||
protected void onCollision(HitResult hitResult) {
|
||||
Map<Identifier, Integer> spells = SpellTag.getSpells(getItem());
|
||||
if (!spells.containsKey(Spells.INWARD_SPELL)) {
|
||||
if (hitResult.getType() == HitResult.Type.BLOCK) {
|
||||
remove();
|
||||
} else if (hitResult.getType() == HitResult.Type.ENTITY) {
|
||||
Entity entity = ((EntityHitResult) hitResult).getEntity();
|
||||
|
||||
if (!getEntityWorld().isClient()) {
|
||||
Map<Identifier, Integer> spells = SpellTag.getSpells(getItem());
|
||||
if (!spells.containsKey(Spells.INWARD_SPELL)) {
|
||||
boolean success = didSpellSucceed(spells);
|
||||
for (Map.Entry<Identifier, Integer> entry : spells.entrySet()) {
|
||||
Spell spell = SpellRegistry.getSpell(entry.getKey(), entry.getValue());
|
||||
Spell spell = SpellRegistry.getSpell(entry);
|
||||
if (spell != null) {
|
||||
if (success) {
|
||||
spell.execute(entity, this, getOwner());
|
||||
if (hitResult.getType() == HitResult.Type.BLOCK) {
|
||||
BlockHitResult blockHitResult = (BlockHitResult) hitResult;
|
||||
spell.execute(getEntityWorld(), blockHitResult);
|
||||
} else if (hitResult.getType() == HitResult.Type.ENTITY) {
|
||||
Entity entity = ((EntityHitResult) hitResult).getEntity();
|
||||
spell.execute(entity, this, getOwner());
|
||||
}
|
||||
} else if (getOwner() != null) {
|
||||
if (getOwner() instanceof PlayerEntity) {
|
||||
PlayerEntity player = (PlayerEntity) getOwner();
|
||||
@ -73,7 +71,6 @@ public class SpellEntity extends ThrownItemEntity {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
remove();
|
||||
}
|
||||
}
|
||||
@ -82,14 +79,13 @@ public class SpellEntity extends ThrownItemEntity {
|
||||
@Override
|
||||
public void tick() {
|
||||
super.tick();
|
||||
if (firstTick) {
|
||||
firstTick = false;
|
||||
if (!getEntityWorld().isClient()) {
|
||||
Map<Identifier, Integer> spells = SpellTag.getSpells(getItem());
|
||||
if (spells.containsKey(Spells.INWARD_SPELL)) {
|
||||
if (getOwner() != null) {
|
||||
boolean success = didSpellSucceed(spells);
|
||||
for (Map.Entry<Identifier, Integer> entry : spells.entrySet()) {
|
||||
Spell spell = SpellRegistry.getSpell(entry.getKey(), entry.getValue());
|
||||
Spell spell = SpellRegistry.getSpell(entry);
|
||||
if (spell != null) {
|
||||
if (success) {
|
||||
spell.execute(getOwner(), this, getOwner());
|
||||
@ -103,8 +99,7 @@ public class SpellEntity extends ThrownItemEntity {
|
||||
remove();
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (!getEntityWorld().isClient()) {
|
||||
|
||||
List<ServerPlayerEntity> viewers = Objects.requireNonNull(getServer()).getPlayerManager().getPlayerList();
|
||||
for (ServerPlayerEntity viewer : viewers) {
|
||||
((ServerWorld) getEntityWorld()).spawnParticles(viewer, ParticleTypes.WITCH, true, getX(), getY(), getZ(), 8, 0.01d, 0.01d, 0.01d, 0.5d);
|
||||
|
@ -52,7 +52,7 @@ public class SpellItem extends Item {
|
||||
@Override
|
||||
public boolean hasEnchantmentGlint(ItemStack stack) {
|
||||
Map<Identifier, Integer> spells = SpellTag.getSpells(stack);
|
||||
return spells.size() > 0;
|
||||
return spells.size() > 0 || super.hasEnchantmentGlint(stack);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -0,0 +1,50 @@
|
||||
package com.thebrokenrail.sorcerycraft.spell;
|
||||
|
||||
import com.thebrokenrail.sorcerycraft.spell.registry.Spell;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.Items;
|
||||
import net.minecraft.tag.BlockTags;
|
||||
import net.minecraft.util.Identifier;
|
||||
import net.minecraft.util.hit.BlockHitResult;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public class CoolingSpell extends Spell {
|
||||
public CoolingSpell(Identifier id, int level) {
|
||||
super(id, level);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Entity target, Entity source, Entity attacker) {
|
||||
target.setFireTicks(0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(World world, BlockHitResult hitResult) {
|
||||
BlockPos blockPos = hitResult.getBlockPos();
|
||||
if (world.getBlockState(blockPos).matches(BlockTags.FIRE)) {
|
||||
world.removeBlock(blockPos, false);
|
||||
}
|
||||
|
||||
BlockPos sideBlockPos = blockPos.offset(hitResult.getSide());
|
||||
if (world.getBlockState(sideBlockPos).matches(BlockTags.FIRE)) {
|
||||
world.removeBlock(sideBlockPos, false);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getXPCost() {
|
||||
return 13;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack getItemCost() {
|
||||
return new ItemStack(Items.ICE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMaxLevel() {
|
||||
return 1;
|
||||
}
|
||||
}
|
@ -1,10 +1,14 @@
|
||||
package com.thebrokenrail.sorcerycraft.spell;
|
||||
|
||||
import com.thebrokenrail.sorcerycraft.spell.registry.Spell;
|
||||
import net.minecraft.block.AbstractFireBlock;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.Items;
|
||||
import net.minecraft.util.Identifier;
|
||||
import net.minecraft.util.hit.BlockHitResult;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public class FlameSpell extends Spell {
|
||||
public FlameSpell(Identifier id, int level) {
|
||||
@ -16,6 +20,14 @@ public class FlameSpell extends Spell {
|
||||
target.setFireTicks(400 + (getLevel() * 200));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(World world, BlockHitResult hitResult) {
|
||||
BlockPos blockPos = hitResult.getBlockPos().offset(hitResult.getSide());
|
||||
if (world.isAir(blockPos)) {
|
||||
world.setBlockState(blockPos, AbstractFireBlock.getState(world, blockPos));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getXPCost() {
|
||||
switch (getLevel()) {
|
||||
|
@ -1,7 +1,6 @@
|
||||
package com.thebrokenrail.sorcerycraft.spell;
|
||||
|
||||
import com.thebrokenrail.sorcerycraft.spell.registry.Spell;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.Items;
|
||||
import net.minecraft.util.Identifier;
|
||||
@ -11,11 +10,6 @@ public class InwardSpell extends Spell {
|
||||
super(id, level);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Entity target, Entity source, Entity attacker) {
|
||||
// NOOP
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getXPCost() {
|
||||
return 16;
|
||||
|
@ -1,7 +1,6 @@
|
||||
package com.thebrokenrail.sorcerycraft.spell;
|
||||
|
||||
import com.thebrokenrail.sorcerycraft.spell.registry.Spell;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.Items;
|
||||
import net.minecraft.util.Identifier;
|
||||
@ -11,11 +10,6 @@ public class SteadfastSpell extends Spell {
|
||||
super(id, level);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Entity target, Entity source, Entity attacker) {
|
||||
// NOOP
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getXPCost() {
|
||||
return 18;
|
||||
|
@ -3,6 +3,8 @@ package com.thebrokenrail.sorcerycraft.spell.registry;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.Identifier;
|
||||
import net.minecraft.util.hit.BlockHitResult;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public abstract class Spell {
|
||||
private final Identifier id;
|
||||
@ -21,7 +23,13 @@ public abstract class Spell {
|
||||
return level;
|
||||
}
|
||||
|
||||
public abstract void execute(Entity target, Entity source, Entity attacker);
|
||||
public void execute(Entity target, Entity source, Entity attacker) {
|
||||
// NOOP
|
||||
}
|
||||
|
||||
public void execute(World world , BlockHitResult hitResult) {
|
||||
// NOOP
|
||||
}
|
||||
|
||||
public abstract int getXPCost();
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
package com.thebrokenrail.sorcerycraft.spell.registry;
|
||||
|
||||
import com.thebrokenrail.sorcerycraft.SorceryCraft;
|
||||
import com.thebrokenrail.sorcerycraft.spell.CoolingSpell;
|
||||
import com.thebrokenrail.sorcerycraft.spell.DamageSpell;
|
||||
import com.thebrokenrail.sorcerycraft.spell.DissolveSpell;
|
||||
import com.thebrokenrail.sorcerycraft.spell.FlameSpell;
|
||||
@ -9,7 +10,6 @@ import com.thebrokenrail.sorcerycraft.spell.InwardSpell;
|
||||
import com.thebrokenrail.sorcerycraft.spell.LevitateSpell;
|
||||
import com.thebrokenrail.sorcerycraft.spell.SteadfastSpell;
|
||||
import com.thebrokenrail.sorcerycraft.spell.TeleportSpell;
|
||||
import com.thebrokenrail.sorcerycraft.spell.registry.SpellRegistry;
|
||||
import net.minecraft.util.Identifier;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
@ -22,6 +22,7 @@ public class Spells {
|
||||
public static final Identifier LEVITATE_SPELL;
|
||||
public static final Identifier TELEPORT_SPELL;
|
||||
public static final Identifier INWARD_SPELL;
|
||||
public static final Identifier COOLING_SPELL;
|
||||
|
||||
static {
|
||||
HEAL_SPELL = SpellRegistry.registerSpell(new Identifier(SorceryCraft.NAMESPACE, "heal_spell"), HealSpell.class);
|
||||
@ -32,5 +33,6 @@ public class Spells {
|
||||
LEVITATE_SPELL = SpellRegistry.registerSpell(new Identifier(SorceryCraft.NAMESPACE, "levitate_spell"), LevitateSpell.class);
|
||||
TELEPORT_SPELL = SpellRegistry.registerSpell(new Identifier(SorceryCraft.NAMESPACE, "teleport_spell"), TeleportSpell.class);
|
||||
INWARD_SPELL = SpellRegistry.registerSpell(new Identifier(SorceryCraft.NAMESPACE, "inward_spell"), InwardSpell.class);
|
||||
COOLING_SPELL = SpellRegistry.registerSpell(new Identifier(SorceryCraft.NAMESPACE, "cooling_spell"), CoolingSpell.class);
|
||||
}
|
||||
}
|
||||
|
@ -71,13 +71,9 @@ public class SpellTag {
|
||||
for (int i = 0; i < spells.size(); i++) {
|
||||
CompoundTag spell = spells.getCompound(i);
|
||||
|
||||
String idStr = spell.getString("id");
|
||||
Identifier id = new Identifier(idStr);
|
||||
if (!idStr.equals(id.toString())) {
|
||||
id = new Identifier(SorceryCraft.NAMESPACE, idStr);
|
||||
}
|
||||
|
||||
Identifier id = new Identifier(spell.getString("id"));
|
||||
int level = spell.getInt("level");
|
||||
|
||||
if (map.get(id) == null || map.get(id) < level) {
|
||||
map.put(id, level);
|
||||
}
|
||||
@ -104,7 +100,7 @@ public class SpellTag {
|
||||
boolean changed = false;
|
||||
|
||||
for (Map.Entry<Identifier, Integer> entry : itemSpells.entrySet()) {
|
||||
Spell spell = SpellRegistry.getSpell(entry.getKey(), entry.getValue());
|
||||
Spell spell = SpellRegistry.getSpell(entry);
|
||||
if (spell != null) {
|
||||
if (spell.getLevel() >= spell.getMaxLevel()) {
|
||||
spell = SpellRegistry.getSpell(entry.getKey(), spell.getMaxLevel() - 1);
|
||||
|
@ -19,5 +19,6 @@
|
||||
"spell.sorcerycraft.flame_spell": "Flame",
|
||||
"spell.sorcerycraft.levitate_spell": "Levitate",
|
||||
"spell.sorcerycraft.teleport_spell": "Teleport",
|
||||
"spell.sorcerycraft.inward_spell": "Inward"
|
||||
"spell.sorcerycraft.inward_spell": "Inward",
|
||||
"spell.sorcerycraft.cooling_spell": "Cooling"
|
||||
}
|
Reference in New Issue
Block a user