Update Mappings Improve /spell command
This commit is contained in:
parent
db54bdf2ad
commit
c592b9e9af
4
API.md
4
API.md
@ -7,7 +7,7 @@
|
|||||||
maven { url 'https://jitpack.io' }
|
maven { url 'https://jitpack.io' }
|
||||||
}
|
}
|
||||||
dependencies {
|
dependencies {
|
||||||
modImplementation 'com.thebrokenrail:sorcerycraft:VERSION'
|
modImplementation 'com.thebrokenrail:sorcerycraft:1.1.+'
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
2. Add Dependency to ```fabric.mod.json```
|
2. Add Dependency to ```fabric.mod.json```
|
||||||
@ -54,7 +54,7 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
4. Register the Spell in your ModInitializer
|
4. Register the spell in your ModInitializer
|
||||||
```java
|
```java
|
||||||
public class ExampleMod implements ModInitializer {
|
public class ExampleMod implements ModInitializer {
|
||||||
public static final Identifier EXAMPLE_SPELL = SpellRegistry.register(new Identifier("modid", "example_spell"), ExampleSpell.class);
|
public static final Identifier EXAMPLE_SPELL = SpellRegistry.register(new Identifier("modid", "example_spell"), ExampleSpell.class);
|
||||||
|
@ -1,5 +1,9 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
**1.1.13**
|
||||||
|
* Update Mappings
|
||||||
|
* Improve ```/spell``` command
|
||||||
|
|
||||||
**1.1.12**
|
**1.1.12**
|
||||||
* Update Mappings
|
* Update Mappings
|
||||||
* Add Config Screen
|
* Add Config Screen
|
||||||
|
@ -65,12 +65,18 @@ You can apply Spells to blank or existing spells in the Casting Table. Doing so
|
|||||||
## ```/spell``` Command
|
## ```/spell``` Command
|
||||||
This command requires OP permissions.
|
This command requires OP permissions.
|
||||||
|
|
||||||
#### ```/spell clear <player>```
|
#### ```/spell forget <player>```
|
||||||
This command clears all known spells from the given player.
|
This command clears all known spells from the given player.
|
||||||
|
|
||||||
|
#### ```/spell forget <player> <spell-id>```
|
||||||
|
This command clears the specified spell from the given player.
|
||||||
|
|
||||||
#### ```/spell list <player>```
|
#### ```/spell list <player>```
|
||||||
This lists all the spells the given player knows.
|
This lists all the spells the given player knows.
|
||||||
|
|
||||||
|
#### ```/spell discover <player>```
|
||||||
|
This adds all spells to the specified player's discovered spells list.
|
||||||
|
|
||||||
#### ```/spell discover <player> <spell-id> <level>```
|
#### ```/spell discover <player> <spell-id> <level>```
|
||||||
This adds the specified spell to the specified player's discovered spells list.
|
This adds the specified spell to the specified player's discovered spells list.
|
||||||
|
|
||||||
|
@ -6,11 +6,11 @@ org.gradle.jvmargs = -Xmx1G
|
|||||||
minecraft_version = 20w11a
|
minecraft_version = 20w11a
|
||||||
curseforge_id = 365308
|
curseforge_id = 365308
|
||||||
simple_minecraft_version = 1.16-Snapshot
|
simple_minecraft_version = 1.16-Snapshot
|
||||||
yarn_mappings = 20w11a+build.7
|
yarn_mappings = 20w11a+build.11
|
||||||
fabric_loader_version = 0.7.8+build.187
|
fabric_loader_version = 0.7.8+build.187
|
||||||
|
|
||||||
# Mod Properties
|
# Mod Properties
|
||||||
mod_version = 1.1.12
|
mod_version = 1.1.13
|
||||||
maven_group = com.thebrokenrail
|
maven_group = com.thebrokenrail
|
||||||
archives_base_name = sorcerycraft
|
archives_base_name = sorcerycraft
|
||||||
|
|
||||||
|
@ -47,7 +47,7 @@ public class CastingTableScreen extends HandledScreen<CastingTableScreenHandler>
|
|||||||
client.getTextureManager().bindTexture(TEXTURE);
|
client.getTextureManager().bindTexture(TEXTURE);
|
||||||
int i = (width - backgroundWidth) / 2;
|
int i = (width - backgroundWidth) / 2;
|
||||||
int j = (height - backgroundHeight) / 2;
|
int j = (height - backgroundHeight) / 2;
|
||||||
blit(i, j, getZOffset(), 0.0F, 0.0F, backgroundWidth, backgroundHeight, 256, 512);
|
drawTexture(i, j, getZOffset(), 0.0F, 0.0F, backgroundWidth, backgroundHeight, 256, 512);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -81,9 +81,9 @@ public class CastingTableScreen extends HandledScreen<CastingTableScreenHandler>
|
|||||||
|
|
||||||
if (k > 0) {
|
if (k > 0) {
|
||||||
int modifier = (int) (((float) indexStartOffset / k) * (1 + 139 - 27));
|
int modifier = (int) (((float) indexStartOffset / k) * (1 + 139 - 27));
|
||||||
blit(i + 94, j + 18 + modifier, getZOffset(), 0.0F, 199.0F, 6, 27, 256, 512);
|
drawTexture(i + 94, j + 18 + modifier, getZOffset(), 0.0F, 199.0F, 6, 27, 256, 512);
|
||||||
} else {
|
} else {
|
||||||
blit(i + 94, j + 18, getZOffset(), 6.0F, 199.0F, 6, 27, 256, 512);
|
drawTexture(i + 94, j + 18, getZOffset(), 6.0F, 199.0F, 6, 27, 256, 512);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,6 +4,8 @@ import com.mojang.brigadier.CommandDispatcher;
|
|||||||
import com.mojang.brigadier.arguments.IntegerArgumentType;
|
import com.mojang.brigadier.arguments.IntegerArgumentType;
|
||||||
import com.mojang.brigadier.exceptions.DynamicCommandExceptionType;
|
import com.mojang.brigadier.exceptions.DynamicCommandExceptionType;
|
||||||
import com.thebrokenrail.sorcerycraft.SorceryCraft;
|
import com.thebrokenrail.sorcerycraft.SorceryCraft;
|
||||||
|
import com.thebrokenrail.sorcerycraft.spell.api.Spell;
|
||||||
|
import com.thebrokenrail.sorcerycraft.spell.registry.SpellRegistry;
|
||||||
import com.thebrokenrail.sorcerycraft.spell.util.SpellPlayerEntity;
|
import com.thebrokenrail.sorcerycraft.spell.util.SpellPlayerEntity;
|
||||||
import com.thebrokenrail.sorcerycraft.spell.util.SpellTag;
|
import com.thebrokenrail.sorcerycraft.spell.util.SpellTag;
|
||||||
import net.minecraft.command.arguments.EntityArgumentType;
|
import net.minecraft.command.arguments.EntityArgumentType;
|
||||||
@ -11,6 +13,7 @@ import net.minecraft.entity.player.PlayerEntity;
|
|||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.server.command.CommandManager;
|
import net.minecraft.server.command.CommandManager;
|
||||||
import net.minecraft.server.command.ServerCommandSource;
|
import net.minecraft.server.command.ServerCommandSource;
|
||||||
|
import net.minecraft.text.Texts;
|
||||||
import net.minecraft.text.TranslatableText;
|
import net.minecraft.text.TranslatableText;
|
||||||
import net.minecraft.util.Formatting;
|
import net.minecraft.util.Formatting;
|
||||||
import net.minecraft.util.Identifier;
|
import net.minecraft.util.Identifier;
|
||||||
@ -28,29 +31,53 @@ public class SpellCommand {
|
|||||||
.then(CommandManager.argument("player", EntityArgumentType.player())
|
.then(CommandManager.argument("player", EntityArgumentType.player())
|
||||||
.executes(ctx -> {
|
.executes(ctx -> {
|
||||||
PlayerEntity player = EntityArgumentType.getPlayer(ctx, "player");
|
PlayerEntity player = EntityArgumentType.getPlayer(ctx, "player");
|
||||||
ctx.getSource().sendFeedback(new TranslatableText("command." + SorceryCraft.NAMESPACE + ".spell.listing_spells", player.getDisplayName()), false);
|
|
||||||
SpellPlayerEntity spellPlayer = (SpellPlayerEntity) player;
|
SpellPlayerEntity spellPlayer = (SpellPlayerEntity) player;
|
||||||
Map<Identifier, Integer> spells = spellPlayer.getDiscoveredSpells();
|
Map<Identifier, Integer> spellMap = spellPlayer.getDiscoveredSpells();
|
||||||
for (Map.Entry<Identifier, Integer> entry : spells.entrySet()) {
|
ctx.getSource().sendFeedback(new TranslatableText("command." + SorceryCraft.NAMESPACE + ".spell.listing_spells", player.getDisplayName(), Texts.join(spellMap.entrySet(), spell -> SpellTag.getTranslatedSpell(spell.getKey(), spell.getValue(), true))), false);
|
||||||
ctx.getSource().sendFeedback(SpellTag.getTranslatedSpell(entry.getKey(), entry.getValue(), true).formatted(Formatting.YELLOW), false);
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
.then(CommandManager.literal("clear")
|
.then(CommandManager.literal("forget")
|
||||||
.then(CommandManager.argument("player", EntityArgumentType.player())
|
.then(CommandManager.argument("player", EntityArgumentType.player())
|
||||||
.executes(ctx -> {
|
.executes(ctx -> {
|
||||||
PlayerEntity player = EntityArgumentType.getPlayer(ctx, "player");
|
PlayerEntity player = EntityArgumentType.getPlayer(ctx, "player");
|
||||||
SpellPlayerEntity spellPlayer = (SpellPlayerEntity) player;
|
SpellPlayerEntity spellPlayer = (SpellPlayerEntity) player;
|
||||||
|
Map<Identifier, Integer> spells = spellPlayer.getDiscoveredSpells();
|
||||||
|
for (Map.Entry<Identifier, Integer> entry : spells.entrySet()) {
|
||||||
|
ctx.getSource().sendFeedback(new TranslatableText("command." + SorceryCraft.NAMESPACE + ".spell.forgotten_spell", player.getDisplayName(), SpellTag.getTranslatedSpellChat(entry.getKey(), entry.getValue())), true);
|
||||||
|
}
|
||||||
spellPlayer.setDiscoveredSpells(new HashMap<>());
|
spellPlayer.setDiscoveredSpells(new HashMap<>());
|
||||||
ctx.getSource().sendFeedback(new TranslatableText("command." + SorceryCraft.NAMESPACE + ".spell.cleared_spells", player.getDisplayName()), true);
|
|
||||||
return 1;
|
return 1;
|
||||||
})
|
})
|
||||||
|
.then(CommandManager.argument("spell", SpellArgumentType.spell())
|
||||||
|
.executes(ctx -> {
|
||||||
|
PlayerEntity player = EntityArgumentType.getPlayer(ctx, "player");
|
||||||
|
Identifier spell = SpellArgumentType.getSpell(ctx, "spell");
|
||||||
|
SpellPlayerEntity spellPlayer = (SpellPlayerEntity) player;
|
||||||
|
Map<Identifier, Integer> spells = spellPlayer.getDiscoveredSpells();
|
||||||
|
if (spells.containsKey(spell)) {
|
||||||
|
ctx.getSource().sendFeedback(new TranslatableText("command." + SorceryCraft.NAMESPACE + ".spell.forgotten_spell", player.getDisplayName(), SpellTag.getTranslatedSpellChat(spell, spells.get(spell))), true);
|
||||||
|
spells.remove(spell);
|
||||||
|
}
|
||||||
|
spellPlayer.setDiscoveredSpells(spells);
|
||||||
|
return 1;
|
||||||
|
})
|
||||||
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
.then(CommandManager.literal("discover")
|
.then(CommandManager.literal("discover")
|
||||||
.then(CommandManager.argument("player", EntityArgumentType.player())
|
.then(CommandManager.argument("player", EntityArgumentType.player())
|
||||||
|
.executes(ctx -> {
|
||||||
|
PlayerEntity player = EntityArgumentType.getPlayer(ctx, "player");
|
||||||
|
Map<Identifier, Integer> spellMap = new HashMap<>();
|
||||||
|
Spell[] maxSpells = SpellRegistry.getMaxSpells();
|
||||||
|
for (Spell spell : maxSpells) {
|
||||||
|
spellMap.put(spell.getID(), spell.getLevel());
|
||||||
|
}
|
||||||
|
SpellTag.learnSpells(player, spellMap);
|
||||||
|
return 1;
|
||||||
|
})
|
||||||
.then(CommandManager.argument("spell", SpellArgumentType.spell())
|
.then(CommandManager.argument("spell", SpellArgumentType.spell())
|
||||||
.then(CommandManager.argument("level", IntegerArgumentType.integer())
|
.then(CommandManager.argument("level", IntegerArgumentType.integer())
|
||||||
.executes(ctx -> {
|
.executes(ctx -> {
|
||||||
@ -85,7 +112,7 @@ public class SpellCommand {
|
|||||||
spellMap.put(spell, level);
|
spellMap.put(spell, level);
|
||||||
SpellTag.setSpells(stack, spellMap);
|
SpellTag.setSpells(stack, spellMap);
|
||||||
|
|
||||||
ctx.getSource().sendFeedback(new TranslatableText("command.sorcerycraft.spell.applied_spell", SpellTag.getTranslatedSpell(spell, level, true)), true);
|
ctx.getSource().sendFeedback(new TranslatableText("command." + SorceryCraft.NAMESPACE + ".spell.applied_spell", SpellTag.getTranslatedSpell(spell, level, true)), true);
|
||||||
return 1;
|
return 1;
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
@ -106,10 +133,12 @@ public class SpellCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Map<Identifier, Integer> spellMap = SpellTag.getSpells(stack);
|
Map<Identifier, Integer> spellMap = SpellTag.getSpells(stack);
|
||||||
spellMap.remove(spell);
|
if (spellMap.containsKey(spell)) {
|
||||||
|
ctx.getSource().sendFeedback(new TranslatableText("command." + SorceryCraft.NAMESPACE + ".spell.removed_spell", SpellTag.getTranslatedSpell(spell, spellMap.get(spell), true)), true);
|
||||||
|
spellMap.remove(spell);
|
||||||
|
}
|
||||||
SpellTag.setSpells(stack, spellMap);
|
SpellTag.setSpells(stack, spellMap);
|
||||||
|
|
||||||
ctx.getSource().sendFeedback(new TranslatableText("command.sorcerycraft.spell.removed_spell", SpellTag.getTranslatedSpell(spell, 0, false)), true);
|
|
||||||
return 1;
|
return 1;
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
|
@ -16,7 +16,7 @@ public abstract class Spell {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the ID of this Spell
|
* Get the ID of this spell
|
||||||
* @return The Spell ID
|
* @return The Spell ID
|
||||||
*/
|
*/
|
||||||
public Identifier getID() {
|
public Identifier getID() {
|
||||||
@ -24,18 +24,18 @@ public abstract class Spell {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the level of this Spell
|
* Get the level of this spell
|
||||||
* @return The Spell Level
|
* @return The Spell's Level
|
||||||
*/
|
*/
|
||||||
public int getLevel() {
|
public int getLevel() {
|
||||||
return level;
|
return level;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Execute this Spell on an Entity
|
* Execute this spell on an Entity
|
||||||
* @param world World
|
* @param world World
|
||||||
* @param source A SpellEntity
|
* @param source A SpellEntity
|
||||||
* @param attacker The Entity that cast this Spell
|
* @param attacker The Entity that cast this spell
|
||||||
* @param target The Target
|
* @param target The Target
|
||||||
*/
|
*/
|
||||||
public void execute(World world, Entity source, Entity attacker, Entity target) {
|
public void execute(World world, Entity source, Entity attacker, Entity target) {
|
||||||
@ -43,10 +43,10 @@ public abstract class Spell {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cast this Spell on a block
|
* Execute this spell on a block
|
||||||
* @param world World
|
* @param world World
|
||||||
* @param source A SpellEntity
|
* @param source A SpellEntity
|
||||||
* @param attacker The Entity that cast this Spell
|
* @param attacker The Entity that cast this spell
|
||||||
* @param hitResult The block's HitResult
|
* @param hitResult The block's HitResult
|
||||||
*/
|
*/
|
||||||
public void execute(World world, Entity source, Entity attacker, BlockHitResult hitResult) {
|
public void execute(World world, Entity source, Entity attacker, BlockHitResult hitResult) {
|
||||||
@ -54,20 +54,20 @@ public abstract class Spell {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the amount of levels required to make this Spell in a Casting Table
|
* Get the amount of levels required to make this spell in a Casting Table
|
||||||
* @return The XP cost
|
* @return The XP cost
|
||||||
*/
|
*/
|
||||||
public abstract int getXPCost();
|
public abstract int getXPCost();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the item(s) required to make ExampleSpell in a Casting Table, or ItemStack.EMPTY if an item is not required
|
* Get the item(s) required to make this spell in a Casting Table, or ItemStack.EMPTY if an item is not required
|
||||||
* @return The item cost
|
* @return The item cost
|
||||||
*/
|
*/
|
||||||
public abstract ItemStack getItemCost();
|
public abstract ItemStack getItemCost();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the maximum level of this Spell
|
* Get the maximum level of this spell
|
||||||
* @return The Max Level
|
* @return The Spell's Max Level
|
||||||
*/
|
*/
|
||||||
public abstract int getMaxLevel();
|
public abstract int getMaxLevel();
|
||||||
}
|
}
|
||||||
|
@ -53,6 +53,18 @@ public class SpellRegistry {
|
|||||||
return out.toArray(new Spell[0]);
|
return out.toArray(new Spell[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Spell[] getMaxSpells() {
|
||||||
|
List<Spell> out = new ArrayList<>();
|
||||||
|
for (Map.Entry<Identifier, Class<?>> entry : spells.entrySet()) {
|
||||||
|
int maxLevel = getMaxLevel(entry.getKey());
|
||||||
|
if (maxLevel == -1) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
out.add(getSpell(entry.getKey(), maxLevel - 1));
|
||||||
|
}
|
||||||
|
return out.toArray(new Spell[0]);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Register a Spell
|
* Register a Spell
|
||||||
* @param id The Spell ID
|
* @param id The Spell ID
|
||||||
|
@ -91,6 +91,10 @@ public class SpellTag {
|
|||||||
return text;
|
return text;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Text getTranslatedSpellChat(Identifier id, int level) {
|
||||||
|
return new LiteralText("[").append(SpellTag.getTranslatedSpell(id, level, true).getString()).append("]").formatted(Formatting.GREEN);
|
||||||
|
}
|
||||||
|
|
||||||
public static void learnSpells(PlayerEntity player, Map<Identifier, Integer> itemSpells) {
|
public static void learnSpells(PlayerEntity player, Map<Identifier, Integer> itemSpells) {
|
||||||
SpellPlayerEntity spellPlayer = (SpellPlayerEntity) player;
|
SpellPlayerEntity spellPlayer = (SpellPlayerEntity) player;
|
||||||
World world = player.getEntityWorld();
|
World world = player.getEntityWorld();
|
||||||
@ -111,8 +115,8 @@ public class SpellTag {
|
|||||||
|
|
||||||
playerSpells.put(spell.getID(), spell.getLevel());
|
playerSpells.put(spell.getID(), spell.getLevel());
|
||||||
assert world.getServer() != null;
|
assert world.getServer() != null;
|
||||||
Text text = new LiteralText("[").append(SpellTag.getTranslatedSpell(spell.getID(), spell.getLevel(), true).getString()).append("]").formatted(Formatting.GREEN);
|
Text text = getTranslatedSpellChat(spell.getID(), spell.getLevel());
|
||||||
world.getServer().getPlayerManager().sendToAll(new TranslatableText("chat." + SorceryCraft.NAMESPACE + ".new_spell", player.getDisplayName(), text));
|
world.getServer().getPlayerManager().sendToAll(new TranslatableText("chat." + SorceryCraft.NAMESPACE + ".discovered_spell", player.getDisplayName(), text));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,10 +4,10 @@
|
|||||||
"itemGroup.sorcerycraft.spells": "SorceryCraft",
|
"itemGroup.sorcerycraft.spells": "SorceryCraft",
|
||||||
"container.sorcerycraft.casting_table": "Casting Table",
|
"container.sorcerycraft.casting_table": "Casting Table",
|
||||||
"container.sorcerycraft.spells": "Spells",
|
"container.sorcerycraft.spells": "Spells",
|
||||||
"chat.sorcerycraft.new_spell": "%s has discovered the spell %s",
|
"chat.sorcerycraft.discovered_spell": "%s has discovered the spell %s",
|
||||||
"entity.sorcerycraft.spell": "Spell",
|
"entity.sorcerycraft.spell": "Spell",
|
||||||
"command.sorcerycraft.spell.cleared_spells": "All discovered spells cleared from %s",
|
"command.sorcerycraft.spell.forgotten_spell": "%s has forgotten the spell %s",
|
||||||
"command.sorcerycraft.spell.listing_spells": "%s has discovered the following spells:",
|
"command.sorcerycraft.spell.listing_spells": "%s has discovered the following spells: %s",
|
||||||
"command.sorcerycraft.spell.unknown_spell": "Unknown spell: %s",
|
"command.sorcerycraft.spell.unknown_spell": "Unknown spell: %s",
|
||||||
"command.sorcerycraft.spell.not_holding_spell": "%s is not holding a spell",
|
"command.sorcerycraft.spell.not_holding_spell": "%s is not holding a spell",
|
||||||
"command.sorcerycraft.spell.applied_spell": "Applied Spell %s",
|
"command.sorcerycraft.spell.applied_spell": "Applied Spell %s",
|
||||||
|
Reference in New Issue
Block a user