Skip to content

Commit

Permalink
Give mobs nametags and make hitting them work
Browse files Browse the repository at this point in the history
Signed-off-by: sqlongithub <[email protected]>
  • Loading branch information
sqlongithub committed May 12, 2021
1 parent 6b06436 commit 85db923
Show file tree
Hide file tree
Showing 11 changed files with 197 additions and 100 deletions.
5 changes: 5 additions & 0 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
<groupId>me.sql</groupId>
<artifactId>exonrpg</artifactId>
<version>1.0</version>
<name>ExonRPG</name>

<properties>
<maven.compiler.source>8</maven.compiler.source>
Expand Down
27 changes: 25 additions & 2 deletions src/main/java/me/sql/exonrpg/ExonRPG.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,27 @@

import co.aikar.commands.PaperCommandManager;
import me.sql.exonrpg.damage.EntityDamage;
import me.sql.exonrpg.mob.Mob;
import me.sql.exonrpg.mob.command.SpawnMobCommand;
import me.sql.exonrpg.player.PlayerJoin;
import me.sql.exonrpg.util.command.ToggleAutosaveCommand;
import org.bukkit.Bukkit;
import org.bukkit.entity.LivingEntity;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.java.JavaPlugin;

import java.util.HashMap;
import java.util.Map;

public class ExonRPG extends JavaPlugin {

// NOTE: Change the below values before publishing a release
public static final String VERSION = "1.0";
public static final String RELEASE_DATE = "" + "2/5/2021";

public static Plugin plugin = Bukkit.getPluginManager().getPlugin("ExonRPG");
public static Map<LivingEntity, Mob> mobs = new HashMap<>();

public static Plugin plugin;
public static void info(String msg) {
Bukkit.getLogger().info("[ExonRPG] "+msg);
}
Expand All @@ -23,19 +32,33 @@ public static void error(String msg) {

@Override
public void onEnable() {
plugin = Bukkit.getPluginManager().getPlugin("ExonRPG");
info("ExonRPG is an open-source MMORPG created by imSQL");
info("and the projects contributors on github.com/sqlongithub/ExonRPG.");
info("You are currently running version "+VERSION+" ("+RELEASE_DATE+")");

PaperCommandManager manager = new PaperCommandManager(this);
manager.registerCommand(new SpawnMobCommand());
manager.registerCommand(new ToggleAutosaveCommand());
Bukkit.getPluginManager().registerEvents(new EntityDamage(), this);

Bukkit.getPluginManager().registerEvents(new PlayerJoin(), this);
}

@Override
public void onDisable() {

}

public static void storeMob(LivingEntity entity, Mob mob) {
mobs.put(entity, mob);
}

public static Mob getMob(LivingEntity entity) {
return mobs.get(entity);
}

public static void deleteMob(LivingEntity mob) {
mobs.remove(mob);
}

}
43 changes: 25 additions & 18 deletions src/main/java/me/sql/exonrpg/damage/EntityDamage.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,61 +2,68 @@

import me.sql.exonrpg.ExonRPG;
import me.sql.exonrpg.mob.Mob;
import me.sql.exonrpg.mob.MobMetadata;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
import org.bukkit.metadata.FixedMetadataValue;

public class EntityDamage implements Listener {

private void dealFallDamage(LivingEntity entity, int blocksFallen) {
int mobHealth = entity.getMetadata(MobMetadata.MOB_HEALTH.toString()).get(0).asInt();
entity.setMetadata(MobMetadata.MOB_HEALTH.toString(), new FixedMetadataValue(ExonRPG.plugin, mobHealth-(blocksFallen/2-1.5)*4));
private void dealFallDamage(Mob mob, int blocksFallen) {
if(mob==null) {
ExonRPG.error("Tried dealing fall damage to non custom mob. Make sure to check if the mob is custom before dealing fall damage to it");
return;
}
mob.damage((int) ((blocksFallen/2-1.5)*4));
}

private void dealDamage(Mob mob, LivingEntity damager) {
int mobHealth = mob.getHealth();
int damage;
if(damager instanceof Player) {
// TODO: Calculate player damage
Player ply = (Player) damager;
int damage = 5;
mob.setHealth(mob.getHealth()-damage);
// Player ply = (Player) damager;
damage = 5;
} else {
// TODO: Calculate mob Damage
int damage = 5;
mob.setHealth(mob.getHealth()-damage);
damage = 5;
}
mob.damage(damage);
}

@EventHandler
public void onMobHitByPlayer(EntityDamageByEntityEvent e) {
// Check if both entities are LivingEntities
if(!(e.getEntity() instanceof LivingEntity && e.getDamager() instanceof LivingEntity))
return;

// Check if damage was done by a plugin
if(e.getCause().equals(DamageCause.CUSTOM))
return;
LivingEntity vic = (LivingEntity) e.getEntity();
LivingEntity damager = (LivingEntity) e.getDamager();

// Check if victim is custom mob
if(!(vic.getMetadata(MobMetadata.IS_CUSTOM_MOB.toString()).get(0).asBoolean()))
Mob mob = ExonRPG.getMob(vic);
if(mob==null)
return;

dealDamage(MobMetadata.getMob(vic), damager);
e.setDamage(0);
dealDamage(mob, damager);

}

@EventHandler
public void onEntityTookFallDamage(EntityDamageEvent e) {
if(!e.getCause().equals(DamageCause.FALL) || e.getEntity() instanceof LivingEntity)
if(!(e.getCause().equals(DamageCause.FALL) && e.getEntity() instanceof LivingEntity))
return;
// TODO: Deal falldamage to mob from formula ((blocksfallen/2)-1.5)*4
LivingEntity entity = (LivingEntity) e.getEntity();
dealFallDamage(entity, Math.round(entity.getFallDistance()));
Mob mob = ExonRPG.getMob(entity);
if(mob==null)
return;
e.setDamage(0);
// TODO: Deal falldamage to mob from formula ((blocksfallen/2)-1.5)*4
dealFallDamage(mob, Math.round(entity.getFallDistance()));


}
Expand Down
42 changes: 33 additions & 9 deletions src/main/java/me/sql/exonrpg/mob/Mob.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,15 +28,17 @@ public Mob(MobType mobType, Location loc) {
this.mobLevel = mobType.getLevel();
this.armor = mobType.getArmor();
this.mobType = mobType;

Entity e = loc.getWorld().spawnEntity(loc, entityType);
if(!(e instanceof LivingEntity)) {
ExonRPG.info("Mob of type "+entityType.toString()+" is not a LivingEntity!");
return;
}
entity = (LivingEntity) e;
MobMetadata.setDefaults(entity, this);
this.location = entity.getLocation();
this.entity.setCustomName("§7[Lvl. "+mobLevel+"] §c"+mobName+" §6"+mobHealth+"§b/"+mobType.getMaxHealth());
ExonRPG.storeMob(entity, this);
updateNametag();
entity.setCustomNameVisible(true);
}


Expand Down Expand Up @@ -64,25 +66,47 @@ public List<ItemStack> getArmor() {
return this.armor;
}

public Location getLocation() { return this.location; }
public Location getLocation() {
return this.location;
}

public LivingEntity getMobEntity() {
return this.entity;
}

public void updateNametag() {
entity.setCustomName("§7[Lvl. "+mobLevel+"] §c"+mobName+" §6"+mobHealth+"§b/"+mobType.getMaxHealth());
if(mobHealth<=mobType.getMaxHealth()*0.4)
entity.setCustomName("§7[Lvl. "+mobLevel+"] §6"+mobName+" §c"+mobHealth+"§7/§a"+mobType.getMaxHealth());
else
entity.setCustomName("§7[Lvl. "+mobLevel+"] §6"+mobName+" §a"+mobHealth+"§7/§a"+mobType.getMaxHealth());
}

public void damage(int damage) {
if(damage>=mobHealth) {
kill();
return;
}
entity.damage(1);
setHealth(mobHealth-damage);
}

public void kill() {
mobHealth = 0;
updateNametag();
entity.damage(entity.getHealth());
ExonRPG.deleteMob(entity);
}

public void setHealth(int health) {
if(health<=0) {
entity.damage(entity.getHealth());
kill();
}
this.mobHealth = health;
mobHealth = health;
updateNametag();
MobMetadata.setMobHealth(entity, health);
}

public void setArmor(List<ItemStack> armor) {
this.armor = armor;
MobMetadata.setMobArmor(entity, armor);

}

}
58 changes: 0 additions & 58 deletions src/main/java/me/sql/exonrpg/mob/MobMetadata.java

This file was deleted.

19 changes: 8 additions & 11 deletions src/main/java/me/sql/exonrpg/mob/command/SpawnMobCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,10 @@
import org.bukkit.Location;
import org.bukkit.entity.Player;

import java.util.Locale;

@CommandAlias("spawnmob")
@CommandPermission("exonrpg.spawnmob")
@CommandPermission("exonrpg.mob.spawnmob")
public class SpawnMobCommand extends BaseCommand {

@Default
Expand All @@ -20,18 +22,13 @@ public void summonMob(Player ply, @Single String mobName) {
ply.sendMessage("§cPlease supply a mob name, i.e ZOMBIE");
return;
}
try {
Location spawnLoc = ply.getTargetBlock(2).getRelative(ply.getTargetBlockFace(2)).getLocation();
MobType type = MobType.fromName(mobName);
if(type==null) {
ply.sendMessage("§cThis mob type is invalid.");
return;
}
Mob mob = new Mob(type, spawnLoc);
} catch(NullPointerException e) {
ply.sendMessage("§cFatal Error trying to get the block you're looking at!");
Location spawnLoc = ply.getLocation().add(ply.getLocation().getDirection().multiply(2));
MobType type = MobType.fromName(mobName.toUpperCase().replaceAll(" ","_"));
if(type==null) {
ply.sendMessage("§cThis mob type is invalid.");
return;
}
Mob mob = new Mob(type, spawnLoc);
}

}
12 changes: 12 additions & 0 deletions src/main/java/me/sql/exonrpg/player/PlayerMetadata.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package me.sql.exonrpg.player;

import org.bukkit.entity.Player;

public enum PlayerMetadata {
PLAYER_STATS;

public static PlayerStats getPlayerStats(Player ply) {
return (PlayerStats) ply.getMetadata(PLAYER_STATS.toString());
}

}
Loading

0 comments on commit 85db923

Please sign in to comment.