1.1.13
All checks were successful
SorceryCraft/pipeline/head This commit looks good

Update Mappings
Improve /spell command
This commit is contained in:
TheBrokenRail 2020-03-17 13:22:49 -04:00
parent db54bdf2ad
commit c592b9e9af
10 changed files with 89 additions and 34 deletions

4
API.md
View File

@ -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);

View File

@ -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

View File

@ -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.

View File

@ -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

View File

@ -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);
} }
} }

View File

@ -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;
})
.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; 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);
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); 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;
}) })
) )

View File

@ -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();
} }

View File

@ -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

View File

@ -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));
} }
} }
} }

View File

@ -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",