RuneHive-Tarnish
Neural OSRS Enhancement Framework
Loading...
Searching...
No Matches
ClanChannel.java
1package com.osroyale.content.clanchannel.channel;
2
3import com.google.gson.*;
4import com.osroyale.Config;
5import com.osroyale.content.Yell;
6import com.osroyale.content.clanchannel.ClanMember;
7import com.osroyale.content.clanchannel.ClanRank;
8import com.osroyale.content.clanchannel.ClanRepository;
9import com.osroyale.content.clanchannel.ClanType;
10import com.osroyale.content.clanchannel.content.*;
11import com.osroyale.game.world.entity.mob.Mob;
12import com.osroyale.game.world.entity.mob.UpdateFlag;
13import com.osroyale.game.world.entity.mob.player.Player;
14import com.osroyale.game.world.items.Item;
15import com.osroyale.game.world.items.containers.pricechecker.PriceType;
16import com.osroyale.game.world.region.RegionManager;
17import com.osroyale.net.packet.out.SendMessage;
18import com.osroyale.net.packet.out.SendScrollbar;
19import com.osroyale.net.packet.out.SendString;
20import com.osroyale.net.packet.out.SendTooltip;
21import com.osroyale.util.Difficulty;
22import com.osroyale.util.Utility;
23import com.osroyale.util.parser.GsonParser;
24
25import java.util.*;
26import java.util.function.Consumer;
27
70
71public class ClanChannel implements Comparable<ClanChannel> {
72
73 private static final Gson GSON = new GsonBuilder().disableHtmlEscaping().setPrettyPrinting().create();
74
76 private ClanDetails details = new ClanDetails(this);
77
79 private ClanManagement management = new ClanManagement(this);
80
82 private ClanShowcase showcase = new ClanShowcase(this);
83
85 private ClanChannelHandler handler = new ClanChannelHandler(this);
86
88 private final Set<ClanMember> members = new HashSet<>();
89
91 final List<String> bannedMembers = new ArrayList<>();
92
94 private int active;
95
96 private ClanChannel() {
97 }
98
99 public static ClanChannel create(Player player) {
100 if (ClanRepository.getChannel(player.getName()) != null) {
101 player.send(new SendMessage("There is already a clan channel under your name!"));
102 return null;
103 }
104 int[] showcase = new int[]{1155, 1117, 1075};
105 ClanChannel channel = new ClanChannel();
106 channel.management.name = player.getName();
107 channel.details.owner = player.getName();
108 channel.management.slogan = "Generic slogan here";
109 channel.details.established = Utility.getSimpleDate();
110 channel.details.type = ClanType.SOCIAL;
111 channel.details.level = ClanLevel.BRONZE;
112 channel.showcase.showcase = showcase;
113 Arrays.stream(showcase).forEach(i -> channel.showcase.showcaseItems.add(i));
114 channel.connect(player);
115 ClanRepository.addChannel(channel);
116 ClanRepository.ALLTIME.add(channel);
117 return channel;
118 }
119
121 void connect(Player player) {
122 ClanMember member = new ClanMember(player);
123
124 if (!player.lastClan.isEmpty()) {
125 if (player.lastClan.equals(details.owner)) {
126 player.lastClan = "";
127 } else if (!members.contains(member)) {
128 handler.sendConnectionWarning(player, member);
129 return;
130 }
131 }
132
133 add(player, member);
134 }
135
136 void add(Player player, ClanMember member) {
137 if (member.name.equalsIgnoreCase(details.owner)) {
138 member.rank = ClanRank.LEADER;
139 }
140
141 if (!handler.attemptConnection(player, member)) {
142 return;
143 }
144
145 if (handler.testPassword(player, member)) {
146 return;
147 }
148
149 int count = getMembers().size();
150
151 establish(player, member);
152
153 if (getMembers().size() > count) {
154 activateAchievement(ClanAchievement.CLAN_MEMBERS_I);
155 activateAchievement(ClanAchievement.CLAN_MEMBERS_II);
156 activateAchievement(ClanAchievement.CLAN_MEMBERS_III);
157 }
158 }
159
160 void establish(Player player, ClanMember member) {
161 player.clanChannel = this;
162 player.clanTag = getTag();
163 player.clanTagColor = details.level.getColor();
164 player.updateFlags.add(UpdateFlag.APPEARANCE);
165
166 if (player.lastClan.equals(details.owner)) {
167 player.lastClan = "";
168 }
169
170 active++;
171 member = getMember(member.name).orElse(member);
172 member.player = Optional.of(player);
173 if (addMember(member)) {
174 member.joined = Utility.getSimpleDate();
175 }
176 handler.connected(member);
177 ClanRepository.setActive(this);
178 }
179
180 private boolean addMember(ClanMember member) {
181 return members.add(member);
182 }
183
185 void disconnect(String name, boolean logout) {
186 Iterator<ClanMember> iterator = members.iterator();
187 while (iterator.hasNext()) {
188 ClanMember member = iterator.next();
189 if (member.name.equals(name)) {
190 if (member.rank == ClanRank.SYSTEM || (member.rank == ClanRank.MEMBER && !member.hasContributed())) {
191 iterator.remove();
192 }
193 member.player.ifPresent(player -> {
194 if (!logout) {
196 player.clanTag = "";
197 player.clanChannel = null;
198 player.updateFlags.add(UpdateFlag.APPEARANCE);
199 player.send(new SendMessage("You have disconnected from the clan chat channel."));
200 }
201 if (member.rank != ClanRank.SYSTEM) {
202 player.lastClan = details.owner;
203 }
204 member.player = Optional.empty();
205 if (--active == 0) {
206 ClanRepository.setInactive(this);
207 }
208 });
209 return;
210 }
211 }
212 }
213
214 public void ban(String name) {
215 bannedMembers.add(name);
216 Iterator<ClanMember> iterator = members.iterator();
217 while (iterator.hasNext()) {
218 ClanMember member = iterator.next();
219
220 if (member.name.equals(name)) {
221 if (member.rank.greaterThanEqual(ClanRank.LEADER)) {
222 return;
223 }
224
225 member.player.ifPresent(player -> {
227 player.clanTag = "";
228 player.lastClan = details.owner;
229 player.clanChannel = null;
230 player.updateFlags.add(UpdateFlag.APPEARANCE);
231 player.send(new SendMessage("You have been banned from the clan chat channel."));
232 member.player = Optional.empty();
233
234 if (--active == 0) {
235 ClanRepository.setInactive(this);
236 }
237 });
238
239 iterator.remove();
240 return;
241 }
242 }
243 }
244
245 public void unban(Player player, int index) {
246 if (index < 0 || index >= bannedMembers.size())
247 return;
248 String name = bannedMembers.get(index);
249 if (bannedMembers.remove(index) != null) {
250 int string = 51311;
251 int size = bannedMembers.size() < 10 ? 10 : bannedMembers.size();
252 for (int idx = 0; idx < size; idx++) {
253 boolean valid = idx < bannedMembers.size();
254 Optional<String> banned = valid ? Optional.of(bannedMembers.get(idx)) : Optional.empty();
255 player.send(new SendString(banned.orElse(""), string));
256 player.send(new SendTooltip(valid ? "Unban " + bannedMembers.get(idx) : "", string));
257 string++;
258 }
259 player.send(new SendScrollbar(51310, size * 23));
260 player.send(new SendMessage("You have unbanned " + name + " from the clan chat channel."));
261 }
262 }
263
264 public void addExperience(double experience) {
265 if (experience + details.experience > Double.MAX_VALUE)
266 return;
267 details.experience += experience;
268 ClanLevel level = ClanLevel.getLevel(details.experience);
269 if (details.level != level) {
270 details.level = level;
271 details.points += level.getPoints();
272 forPlayers(player -> {
273 player.clanTagColor = level.getColor();
274 player.updateFlags.add(UpdateFlag.APPEARANCE);
275 });
276 message("We have leveled up to <col=255>" + Utility.formatEnum(level.name()) + "</col>! Total Experience: <col=255>" + Utility.formatDigits(details.experience), "We have earned <col=255>" + level.getPoints() + "</col> CP, which puts us at <col=255>" + Utility.formatDigits(details.points) + "</col> CP.");
277 }
278 }
279
280 public void receiveTask(Difficulty difficulty) {
281 if (details.clanTask == null) {
282 ClanTask task = ClanTask.getAssignment(details.type, difficulty);
283 details.taskAmount = task.getAmount();
284 details.clanTask = task;
285 message("Task time! <col=255>" + task.getName(this) + "</col>.");
286 }
287 }
288
289 public void activateTask(ClanTaskKey key, String name) {
290 activateTask(key, name, 1);
291 }
292
293 public void activateTask(ClanTaskKey key, String name, int amount) {
294 if (details.clanTask == null)
295 return;
296 ClanTask task = details.clanTask;
297 if (task.key != key)
298 return;
299 double experience = task.getProgressExperience();
300 int progress = details.taskAmount - amount;
301 if (progress <= 0) {
302 int reward = details.clanTask.getReward();
303 details.points += reward;
304 message("Task complete! Reward: <col=255>" + reward + "</col> CP. We now have: <col=255>" + Utility.formatDigits(details.points) + "</col> CP.");
305 details.clanTask = null;
306 progress = 0;
307 activateAchievement(ClanAchievement.TASKS_I);
308 activateAchievement(ClanAchievement.TASKS_II);
309 activateAchievement(ClanAchievement.TASKS_III);
310 }
311
312 details.taskAmount = progress;
313 addExperience(experience);
314 getMember(name).ifPresent(member -> {
315 member.expGained += experience;
316 if (task.type == ClanType.PVP) {
317 member.playerKills++;
318 } else if (task.type == ClanType.PVM) {
319 member.npcKills++;
320 }
321
322 member.player.ifPresent(player -> {
323 if (!player.lastClan.isEmpty() && !player.lastClan.equalsIgnoreCase(player.getName())) {
324 ClanChannel channel = ClanRepository.getChannel(player.lastClan);
325 if (channel != null)
326 channel.disconnect(name, false);
327 }
328 });
329 });
330 }
331
332 public void activateAchievement(ClanAchievement achievement) {
333 final int current = details.achievements.computeIfAbsent(achievement, a -> 0);
334 for (ClanAchievement list : ClanAchievement.values()) {
335 if (list == achievement) {
336 details.achievements.put(achievement, current + 1);
337 if (details.completedAchievement(list)) {
338 message("Achievement completed! " + list.details, "We have earned " + list.getPoints() + " CP and " + Utility.formatDigits(list.getExperience()) + " Clan EXP.");
339 }
340 }
341 }
342 }
343
344 public void setRank(ClanMember member, ClanRank rank) {
345 member.player.ifPresent(player -> {
346 if (!player.lastClan.isEmpty() && !player.lastClan.equalsIgnoreCase(player.getName())) {
347 ClanChannel channel = ClanRepository.getChannel(player.lastClan);
348 if (channel != null)
349 channel.disconnect(member.name, false);
350 }
351 });
352 member.rank = rank;
353 }
354
355 public void setName(Player player, String name) {
356 if (getName().equalsIgnoreCase(name)) {
357 player.message("Your clan channel name is already set to " + getName() + "!");
358 return;
359 }
360 if (Arrays.stream(Config.BAD_STRINGS).anyMatch(name::contains)) {
361 player.message("The name you have entered was prohibited! Try something else.");
362 return;
363 }
364 if (ClanRepository.nameExist(name)) {
365 player.message("There is already a clan that exists with that name!");
366 return;
367 }
368 name = Utility.formatName(name);
369 if (!management.name.isEmpty())
370 ClanRepository.ACTIVE_NAMES.remove(management.name.toLowerCase().trim());
371 ClanRepository.ACTIVE_NAMES.add(name.toLowerCase().trim());
372 management.name = name;
373 message("The clan name has been changed to: <col=255>" + name + "</col>.");
374 player.clanViewer.update(this);
375 }
376
377 public void setTag(Player player, String tag) {
378 if (tag.length() > 4)
379 return;
380 if (getTag().equalsIgnoreCase(tag)) {
381 player.message("Your clan channel tag is already set to " + getTag() + "!");
382 return;
383 }
384 if (Arrays.stream(Config.BAD_STRINGS).anyMatch(tag::contains)) {
385 player.message("The tag you have entered was prohibited! Try something else.");
386 return;
387 }
388 if (ClanRepository.tagExist(tag)) {
389 player.message("There is already a clan that exists with that tag!");
390 return;
391 }
392 if (!management.tag.isEmpty())
393 ClanRepository.ACTIVE_TAGS.remove(management.tag);
394 ClanRepository.ACTIVE_TAGS.add(management.tag = tag);
395 message("The clan tag has been changed to: <col=255>" + getTag() + "</col>.");
396 player.clanViewer.update(this);
397 }
398
399 public void setSlogan(Player player, String slogan) {
400 if (Arrays.stream(Config.BAD_STRINGS).anyMatch(slogan::contains)) {
401 player.message("The slogan you have entered was prohibited! Try something else.");
402 return;
403 }
404 management.slogan = Utility.formatName(slogan);
405 player.clanViewer.update(this);
406 }
407
408 public Optional<ClanMember> getMember(String name) {
409 for (ClanMember member : members) {
410 if (member.name.equalsIgnoreCase(name))
411 return Optional.of(member);
412 }
413 return Optional.empty();
414 }
415
416 List<ClanMember> getActiveMembers() {
417 List<ClanMember> list = new LinkedList<>();
418 forEach(member -> member.player.ifPresent(player -> list.add(member)));
419 return list;
420 }
421
423 private void forPlayers(Consumer<Player> player) {
424 for (ClanMember member : members) {
425 member.player.ifPresent(player);
426 }
427 }
428
430 public void forEach(Consumer<ClanMember> member) {
431 members.forEach(member);
432 }
433
435 public void message(Object... messages) {
436 forEach(member -> member.message(messages));
437 }
438
439 public void chat(String name, String message) {
440 getMember(name).ifPresent(member -> {
441 if (management.canTalk(member)) {
442 if (Arrays.stream(Yell.INVALID).anyMatch(message::contains)) {
443 member.message("Your message contains invalid characters.");
444 return;
445 }
446
447 forEach(other -> other.chat(member, message));
448 } else {
449 member.message("Your rank is too low to talk in this channel.");
450 }
451 });
452 }
453
454 public void splitLoot(Player player, Mob dead, Item item) {
455 if (!lootshareEnabled()) {
456 return;
457 }
458
459 Set<Player> players = new HashSet<>();
460 long value = item.getValue(PriceType.HIGH_ALCH_VALUE) * item.getAmount();
461 long tax = value / 4;
462 players.add(player);
463
464 RegionManager.forNearbyPlayer(dead, 32, nearby -> {
465 if (Objects.equals(nearby.clanChannel, player.clanChannel)) {
466 players.add(nearby);
467 }
468 });
469
470 long split = (value - tax) / players.size();
471 players.forEach(other -> {
472 getMember(other.getName()).ifPresent(member ->
473 member.message(Utility.formatDigits(split) + " coins have been deposited into your bank vault."));
474// other.bankVault.deposit((int) split);
475 });
476 }
477
478 public String getName() {
479 return management.name;
480 }
481
482 public String getOwner() {
483 return details.owner;
484 }
485
486 public int size() {
487 return members.size();
488 }
489
490 public int activeSize() {
491 return active;
492 }
493
494 public boolean lootshareEnabled() {
495 return management.lootshare;
496 }
497
498 public boolean canManage(ClanMember member) {
499 return member != null && management.canManage(member);
500 }
501
502 boolean isBanned(String name) {
503 for (String banned : bannedMembers) {
504 if (banned.equalsIgnoreCase(name)) {
505 return true;
506 }
507 }
508 return false;
509 }
510
511 public boolean isLocked() {
512 return management.locked;
513 }
514
515 boolean canEnter(ClanMember member) {
516 return management.canEnter(member);
517 }
518
519 boolean hasPassword() {
520 return management.password != null && !management.password.isEmpty();
521 }
522
523 boolean isPassword(String input) {
524 return input.equals(management.password);
525 }
526
527 public ClanDetails getDetails() {
528 return details;
529 }
530
531 public ClanManagement getManagement() {
532 return management;
533 }
534
535 public Set<ClanMember> getMembers() {
536 return members;
537 }
538
539 public ClanChannelHandler getHandler() {
540 return handler;
541 }
542
543 public String getSlogan() {
544 return management.slogan;
545 }
546
547 public String getPassword() {
548 return management.password;
549 }
550
551 public String getTag() {
552 return management.tag;
553 }
554
555 public String getColor() {
556 return management.color;
557 }
558
559 public ClanShowcase getShowcase() {
560 return showcase;
561 }
562
563 public Item[] getShowcaseItems() {
564 Item[] items = new Item[showcase.showcase.length];
565 int count = 0;
566 for (int iem : showcase.showcase) {
567 items[count] = new Item(iem, 1);
568 if (items[count].isStackable()) {
569 items[count].setAmount(250);
570 }
571 count++;
572 }
573 return items;
574 }
575
576 public void setColor(String color) {
577 management.color = color;
578 }
579
580 public JsonObject toJson() {
581 JsonObject object = new JsonObject();
582 object.addProperty("owner", details.owner);
583 object.addProperty("established", details.established);
584 object.addProperty("name", management.name);
585 object.addProperty("password", management.password);
586 object.addProperty("forum", management.forum);
587 object.addProperty("slogan", management.slogan);
588 object.addProperty("clan-tag", management.tag);
589 object.addProperty("clan-type", String.valueOf(details.type));
590 object.addProperty("clan-color", management.color);
591 object.addProperty("clan-points", details.points);
592 object.addProperty("clan-experience", details.experience);
593 object.addProperty("clan-level", String.valueOf(details.level));
594 if (details.clanTask != null) {
595 object.addProperty("clan-task", String.valueOf(details.clanTask));
596 }
597 object.addProperty("task-amount", details.taskAmount);
598 object.addProperty("locked", management.locked);
599 object.addProperty("lootshare", management.lootshare);
600 management.saveRanks(object);
601
602 object.add("showcase", GSON.toJsonTree(showcase.showcase));
603 object.add("showcase-items", GSON.toJsonTree(showcase.showcaseItems));
604 object.add("banned-members", GSON.toJsonTree(bannedMembers));
605
606 JsonArray memberArray = new JsonArray();
607 for (ClanMember member : members) {
608 JsonObject memberObj = new JsonObject();
609 memberObj.addProperty("name", member.name);
610 memberObj.addProperty("joined", member.joined);
611 memberObj.addProperty("rank", String.valueOf(member.rank));
612 memberObj.addProperty("exp-gained", member.expGained);
613 memberObj.addProperty("npc-kills", member.npcKills);
614 memberObj.addProperty("player-kills", member.playerKills);
615 memberObj.addProperty("total-level", member.totalLevel);
616 memberArray.add(memberObj);
617 }
618 object.add("members", memberArray);
619 return object;
620 }
621
622 public static void load(String owner) {
623 new GsonParser("/content/clan/" + owner, false) {
624 @Override
625 protected void parse(JsonObject object) {
626 ClanChannel channel = new ClanChannel();
627
628 channel.details.owner = object.get("owner").getAsString();
629 channel.management.name = object.get("name").getAsString();
630 if (object.has("password")) {
631 channel.management.password = object.get("password").getAsString();
632 }
633 channel.details.established = object.get("established").getAsString();
634 if (object.has("forum")) {
635 channel.management.forum = object.get("forum").getAsString();
636 }
637 if (object.has("slogan")) {
638 channel.management.slogan = object.get("slogan").getAsString();
639 }
640 if (object.has("clan-tag")) {
641 channel.management.tag = object.get("clan-tag").getAsString();
642 }
643 channel.details.type = ClanType.valueOf(object.get("clan-type").getAsString());
644 if (object.has("clan-color")) {
645 channel.management.color = object.get("clan-color").getAsString();
646 }
647
648 channel.details.points = object.get("clan-points").getAsInt();
649 channel.details.experience = object.get("clan-experience").getAsLong();
650 channel.details.level = ClanLevel.valueOf(object.get("clan-level").getAsString());
651 if (object.has("clan-task")) {
652 channel.details.clanTask = ClanTask.valueOf(object.get("clan-task").getAsString());
653 }
654 channel.details.taskAmount = object.get("task-amount").getAsInt();
655 channel.management.locked = object.get("locked").getAsBoolean();
656 channel.management.lootshare = object.get("lootshare").getAsBoolean();
657 channel.management.loadRanks(object);
658 channel.showcase.showcase = GSON.fromJson(object.get("showcase"), int[].class);
659
660 JsonArray array = object.get("showcase-items").getAsJsonArray();
661 for (JsonElement element : array) {
662 channel.showcase.showcaseItems.add(element.getAsInt());
663 }
664
665 array = object.get("banned-members").getAsJsonArray();
666 for (JsonElement element : array) {
667 channel.bannedMembers.add(element.getAsString());
668 }
669
670 JsonArray members = object.get("members").getAsJsonArray();
671 for (JsonElement element : members) {
672 JsonObject memberObj = (JsonObject) element;
673 String name = memberObj.get("name").getAsString();
674 ClanMember member = new ClanMember(name);
675 member.joined = memberObj.get("joined").getAsString();
676 member.rank = ClanRank.valueOf(memberObj.get("rank").getAsString());
677 member.expGained = memberObj.get("exp-gained").getAsDouble();
678 member.npcKills = memberObj.get("npc-kills").getAsInt();
679 member.playerKills = memberObj.get("player-kills").getAsInt();
680 member.totalLevel = memberObj.get("total-level").getAsInt();
681 channel.addMember(member);
682 }
683
684 if (!channel.getTag().isEmpty())
685 ClanRepository.ACTIVE_TAGS.add(channel.getTag());
686 if (!channel.getName().isEmpty())
687 ClanRepository.ACTIVE_NAMES.add(channel.getName());
688 ClanRepository.ALLTIME.add(channel);
689 ClanRepository.addChannel(channel);
690 }
691 }.run();
692 }
693
694 @Override
695 public int compareTo(ClanChannel other) {
696 int compare = Double.compare(other.details.experience, details.experience);
697 if (compare == 0)
698 return management.name.compareTo(other.management.name);
699 return compare;
700 }
701
702 @Override
703 public int hashCode() {
704 return details.owner.hashCode();
705 }
706
707 @Override
708 public boolean equals(Object obj) {
709 if (obj == this) return true;
710 if (obj instanceof ClanChannel) {
711 ClanChannel other = (ClanChannel) obj;
712 return Objects.equals(details, other.details)
713 && Objects.equals(management, other.management);
714 }
715 return super.equals(obj);
716 }
717}
static final String[] BAD_STRINGS
Definition Config.java:254
static final String[] INVALID
Definition Yell.java:43
static ClanChannel getChannel(String channel)
static void addChannel(ClanChannel channel)
void forEach(Consumer< ClanMember > member)
static String formatDigits(final int amount)
Definition Utility.java:78
static String getSimpleDate()
Definition Utility.java:168
static String formatEnum(final String string)
Definition Utility.java:126
static ClanLevel getLevel(double experience)