Skip to content

Commit c73dc02

Browse files
committed
Send message if mob killed by non-player (e.g. other mob), closes #2
1 parent 750366d commit c73dc02

File tree

6 files changed

+189
-49
lines changed

6 files changed

+189
-49
lines changed

README.md

+4-1
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,14 @@ The following event types are currently available and can be used for the type i
4747
* `attacked` - Mob has been attacked by a player
4848
* `idle` - Mob is idle, for example the mob is just standing/walking/running around (Currently unused)
4949
* `interacted` - Player interacted with the mob (Right click on mob)
50-
* `killed` - Mob has been killed by a player
50+
* `killed_player` - Mob has been killed by a player
51+
* `killed_other` - Mob has been killed by something else (not a player)
5152
* `looking` - Mob is looking at the player (and player is looking at the mob)
5253
* `spawn` - Mob has been spawned (Mob spawner, egg or another plugin by default, but can be configured in config.yml)
5354
* `tamed` - Mob has been tamed
5455

56+
Additional to those event types, the `killed` event type can be used in the messages configuration to define a message for both types (player and other).
57+
5558

5659
## Configuration
5760

pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
<groupId>com.selfcoders</groupId>
55
<artifactId>talkingmobs</artifactId>
6-
<version>1.3</version>
6+
<version>1.4</version>
77
<packaging>jar</packaging>
88

99
<name>TalkingMobs</name>

src/main/java/com/selfcoders/talkingmobs/EventListener.java

+29-11
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import org.bukkit.event.player.PlayerMoveEvent;
1616
import org.bukkit.util.Vector;
1717

18+
import java.util.ArrayList;
1819
import java.util.List;
1920

2021
/**
@@ -42,7 +43,7 @@ public void onCreatureSpawn(CreatureSpawnEvent event) {
4243
List<String> allowedSpawnReasons = plugin.getConfig().getStringList("events.spawned");
4344

4445
if (allowedSpawnReasons.contains(spawnReason.name())) {
45-
message.sendMessage(entity, Message.EventType.spawned);
46+
message.sendMessage(entity, Message.EventType.SPAWNED);
4647
}
4748
}
4849

@@ -56,21 +57,38 @@ public void onEntityAttacked(EntityDamageByEntityEvent event) {
5657
Entity entity = event.getEntity();
5758

5859
if (damager instanceof Player && !entity.isDead()) {
59-
message.sendMessage(entity, (Player) damager, Message.EventType.attacked);
60+
message.sendMessage(entity, (Player) damager, Message.EventType.ATTACKED);
6061
}
6162
}
6263

6364
@EventHandler
6465
public void onEntityKilled(EntityDeathEvent event) {
65-
if (!plugin.getConfig().getBoolean("events.killed")) {
66-
return;
67-
}
68-
6966
LivingEntity entity = event.getEntity();
7067
Player killer = entity.getKiller();
7168

72-
if (killer != null) {
73-
message.sendMessage(entity, killer, Message.EventType.killed);
69+
if (killer == null) {
70+
if (!plugin.getConfig().getBoolean("events.killed_other")) {
71+
return;
72+
}
73+
74+
List<Message.EventType> eventTypes = new ArrayList<>();
75+
76+
eventTypes.add(Message.EventType.KILLED_OTHER);
77+
eventTypes.add(Message.EventType.KILLED);
78+
79+
message.sendMessage(entity, Message.EventType.KILLED_OTHER, eventTypes);
80+
} else {
81+
// events.killed is used till version 1.3 and is now deprecated
82+
if (!plugin.getConfig().getBoolean("events.killed_player") && !plugin.getConfig().getBoolean("events.killed")) {
83+
return;
84+
}
85+
86+
List<Message.EventType> eventTypes = new ArrayList<>();
87+
88+
eventTypes.add(Message.EventType.KILLED_PLAYER);
89+
eventTypes.add(Message.EventType.KILLED);
90+
91+
message.sendMessage(entity, killer, Message.EventType.KILLED_PLAYER, eventTypes);
7492
}
7593
}
7694

@@ -80,7 +98,7 @@ public void onPlayerInteractEntity(PlayerInteractEntityEvent event) {
8098
return;
8199
}
82100

83-
message.sendMessage(event.getRightClicked(), event.getPlayer(), Message.EventType.interacted);
101+
message.sendMessage(event.getRightClicked(), event.getPlayer(), Message.EventType.INTERACTED);
84102
}
85103

86104
@EventHandler
@@ -97,7 +115,7 @@ public void onEntityTame(EntityTameEvent event) {
97115

98116
Player player = (Player) owner;
99117

100-
message.sendMessage(event.getEntity(), player, Message.EventType.tamed);
118+
message.sendMessage(event.getEntity(), player, Message.EventType.TAMED);
101119
}
102120

103121
@EventHandler
@@ -133,7 +151,7 @@ public void onPlayerMove(PlayerMoveEvent event) {
133151
}
134152

135153
private void onEntityFacingPlayer(LivingEntity entity, Player player) {
136-
message.sendMessage(entity, player, Message.EventType.looking);
154+
message.sendMessage(entity, player, Message.EventType.LOOKING);
137155
}
138156

139157
/**

src/main/java/com/selfcoders/talkingmobs/Message.java

+141-33
Original file line numberDiff line numberDiff line change
@@ -26,31 +26,65 @@ public enum EventType {
2626
/**
2727
* Mob has been attacked by a player
2828
*/
29-
attacked,
29+
ATTACKED("attacked", true),
3030
/**
3131
* Mob is idle (Is just standing/walking/running around) -> Unused
3232
*/
33-
idle,
33+
IDLE("idle", true),
3434
/**
3535
* Player interacted with the mob (Right clicked on mob)
3636
*/
37-
interacted,
37+
INTERACTED("interacted", true),
38+
/**
39+
* Mob has been killed
40+
*/
41+
KILLED("killed", false),
3842
/**
3943
* Mob has been killed by a player
4044
*/
41-
killed,
45+
KILLED_PLAYER("killed_player", true),
46+
/**
47+
* Mob has been killed by something else (not a player)
48+
*/
49+
KILLED_OTHER("killed_other", true),
4250
/**
4351
* Mob is looking at the player (and player is looking at the mob)
4452
*/
45-
looking,
53+
LOOKING("looking", true),
4654
/**
4755
* Mob has been spawned (Mob spawner, egg or another plugin by default, but can be configured in config.yml)
4856
*/
49-
spawned,
57+
SPAWNED("spawned", true),
5058
/**
5159
* Mob has been tamed
5260
*/
53-
tamed
61+
TAMED("tamed", true);
62+
63+
private String type;
64+
private boolean toggleable;
65+
66+
EventType(String type, boolean toggleable) {
67+
this.type = type;
68+
this.toggleable = toggleable;
69+
}
70+
71+
public String getType() {
72+
return type;
73+
}
74+
75+
public boolean isToggleable() {
76+
return toggleable;
77+
}
78+
79+
public static EventType fromString(String type) {
80+
for (EventType eventType : values()) {
81+
if (eventType.getType().equalsIgnoreCase(type)) {
82+
return eventType;
83+
}
84+
}
85+
86+
return null;
87+
}
5488
}
5589

5690
/**
@@ -73,6 +107,29 @@ public void reloadConfig() {
73107
playersConfig.reload();
74108
}
75109

110+
/**
111+
* Get a list of messages configured for the specified mob and event type
112+
*
113+
* @param mob The entity of the mob for which the messages should be fetched
114+
* @param eventType The event type of the messages
115+
* @return A list of messages or null if there a none
116+
*/
117+
private List<String> getMessages(Entity mob, EventType eventType) {
118+
List<String> messages;
119+
String mobTypeName = mob.getType().name().toLowerCase();
120+
121+
messages = messagesConfig.getConfig().getStringList(mobTypeName + "." + eventType.getType());
122+
if (messages.size() == 0) {
123+
messages = messagesConfig.getConfig().getStringList("default." + eventType.getType());
124+
125+
if (messages.size() == 0) {
126+
return null;
127+
}
128+
}
129+
130+
return messages;
131+
}
132+
76133
/**
77134
* Get a random message for the specified mob and event type
78135
*
@@ -81,38 +138,33 @@ public void reloadConfig() {
81138
* @return A string containing the message
82139
*/
83140
private String getMessage(Entity mob, EventType eventType) {
84-
List<String> messages;
85141
String mobTypeName = mob.getType().name().toLowerCase();
86142

87-
messages = messagesConfig.getConfig().getStringList(mobTypeName + "." + eventType.name());
88-
if (messages.size() == 0) {
89-
messages = messagesConfig.getConfig().getStringList("default." + eventType.name());
143+
List<String> messages = getMessages(mob, eventType);
144+
145+
if (messages == null) {
146+
plugin.getLogger().log(Level.INFO, "No messages for event ''{0}'' of mob ''{1}'' defined!", new Object[]{eventType.getType(), mobTypeName});
147+
return null;
90148
}
91149

92-
if (messages.size() > 0) {
93-
Random randomGenerator = new Random();
150+
Random randomGenerator = new Random();
94151

95-
String message = plugin.getConfig().getString("messageFormat." + eventType.name());
152+
String message = plugin.getConfig().getString("messageFormat." + eventType.getType());
96153

97-
if (message == null) {
98-
message = plugin.getConfig().getString("messageFormat.default");
154+
if (message == null) {
155+
message = plugin.getConfig().getString("messageFormat.default");
99156

100-
if (message == null) {
101-
message = "[&a%mobname%&r] %message%";
102-
plugin.getLogger().log(Level.INFO, "Message format for event type ''{0}'' not defined!", eventType.name());
103-
}
157+
if (message == null) {
158+
message = "[&a%mobname%&r] %message%";
159+
plugin.getLogger().log(Level.INFO, "Message format for event type ''{0}'' not defined!", eventType.getType());
104160
}
105-
106-
message = message.replaceAll("%message%", messages.get(randomGenerator.nextInt(messages.size())));
107-
message = message.replaceAll("%mobname%", mobTypeName);
108-
message = message.replaceAll("%event%", eventType.name());
109-
110-
return message;
111-
} else {
112-
plugin.getLogger().log(Level.INFO, "No messages for event ''{0}'' of mob ''{1}'' defined!", new Object[]{eventType.name(), mobTypeName});
113161
}
114162

115-
return null;
163+
message = message.replaceAll("%message%", messages.get(randomGenerator.nextInt(messages.size())));
164+
message = message.replaceAll("%mobname%", mobTypeName);
165+
message = message.replaceAll("%event%", eventType.getType());
166+
167+
return message;
116168
}
117169

118170
/**
@@ -138,7 +190,7 @@ public boolean isEnabled(Player player, EventType eventType) {
138190
return false;
139191
}
140192

141-
return playersConfig.getConfig().getBoolean(player.getName() + ".enabled." + eventType.name(), true);
193+
return playersConfig.getConfig().getBoolean(player.getName() + ".enabled." + eventType.getType(), true);
142194
}
143195

144196
/**
@@ -152,7 +204,7 @@ public boolean isEnabled(Player player) {
152204
}
153205

154206
private boolean isSpamming(Entity mob, Player player, EventType eventType) {
155-
String key = String.valueOf(mob.getEntityId()) + "/" + String.valueOf(player.getEntityId()) + "/" + eventType.name();
207+
String key = String.valueOf(mob.getEntityId()) + "/" + String.valueOf(player.getEntityId()) + "/" + eventType.getType();
156208
Long now = System.currentTimeMillis();
157209
Long spamTimeout = plugin.getConfig().getLong("spam-timeout");
158210

@@ -197,6 +249,27 @@ public void sendMessage(Entity mob, Player player, EventType eventType) {
197249
sendMessage(mob, player, eventType, message);
198250
}
199251

252+
/**
253+
* Send a mob message to the player
254+
*
255+
* @param mob The mob which sends the message
256+
* @param player The player which should receive the message
257+
* @param originalEventType The original event type which triggered this message
258+
* @param possibleEventTypes The event types of which to pick the first possible one for getting the message
259+
*/
260+
public void sendMessage(Entity mob, Player player, EventType originalEventType, List<EventType> possibleEventTypes) {
261+
for (EventType eventType : possibleEventTypes) {
262+
if (getMessages(mob, eventType) == null) {
263+
continue;
264+
}
265+
266+
String message = getMessage(mob, eventType);
267+
268+
sendMessage(mob, player, originalEventType, message);
269+
return;
270+
}
271+
}
272+
200273
/**
201274
* Send a mob message to all players
202275
*
@@ -222,6 +295,37 @@ public void sendMessage(Entity mob, EventType eventType) {
222295
}
223296
}
224297

298+
/**
299+
* Send a mob message to all players
300+
*
301+
* @param mob The mob which sends the message
302+
* @param originalEventType The original event type which triggered this message
303+
* @param possibleEventTypes The event types of which to pick the first possible one for getting the message
304+
*/
305+
public void sendMessage(Entity mob, EventType originalEventType, List<EventType> possibleEventTypes) {
306+
if (mob instanceof Player) {
307+
return;
308+
}
309+
310+
if (!(mob instanceof LivingEntity)) {
311+
return;
312+
}
313+
314+
for (EventType eventType : possibleEventTypes) {
315+
if (getMessages(mob, eventType) == null) {
316+
continue;
317+
}
318+
319+
String message = getMessage(mob, eventType);
320+
321+
for (Player player : plugin.getServer().getOnlinePlayers()) {
322+
sendMessage(mob, player, originalEventType, message);
323+
}
324+
325+
return;
326+
}
327+
}
328+
225329
/**
226330
* Send the given mob message to the player
227331
*
@@ -271,7 +375,7 @@ private void sendMessage(Entity mob, Player player, EventType eventType, String
271375
* @param state The new state
272376
*/
273377
public void setEnabled(Player player, EventType eventType, Boolean state) {
274-
playersConfig.getConfig().set(player.getName() + ".enabled." + eventType.name(), state);
378+
playersConfig.getConfig().set(player.getName() + ".enabled." + eventType.getType(), state);
275379
playersConfig.getConfig().set(player.getName() + ".enabled.all", true);
276380

277381
playersConfig.save();
@@ -287,7 +391,11 @@ public void setEnabled(Player player, Boolean state) {
287391
playersConfig.getConfig().set(player.getName() + ".enabled.all", state);
288392

289393
for (EventType eventType : EventType.values()) {
290-
playersConfig.getConfig().set(player.getName() + ".enabled." + eventType.name(), state);
394+
if (!eventType.isToggleable()) {
395+
continue;
396+
}
397+
398+
playersConfig.getConfig().set(player.getName() + ".enabled." + eventType.getType(), state);
291399
}
292400

293401
playersConfig.save();

0 commit comments

Comments
 (0)