use of panda.std.Option in project FunnyGuilds by FunnyGuilds.
the class PlayerDeath method onDeath.
@EventHandler
public void onDeath(PlayerDeathEvent event) {
Player playerVictim = event.getEntity();
Player playerAttacker = event.getEntity().getKiller();
Option<User> victimOption = this.userManager.findByPlayer(playerVictim);
if (victimOption.isEmpty()) {
return;
}
User victim = victimOption.get();
UserCache victimCache = victim.getCache();
DeathsChangeEvent deathsChangeEvent = new DeathsChangeEvent(EventCause.USER, victim, victim, 1);
if (SimpleEventHandler.handle(deathsChangeEvent)) {
victim.getRank().updateDeaths(currentValue -> currentValue + deathsChangeEvent.getDeathsChange());
}
if (playerAttacker == null) {
if (!config.considerLastAttackerAsKiller) {
victimCache.clearDamage();
return;
}
User lastAttacker = victimCache.getLastKiller();
if (lastAttacker == null || !lastAttacker.isOnline()) {
victimCache.clearDamage();
return;
}
Long attackTime = victimCache.wasVictimOf(lastAttacker);
if (attackTime == null || attackTime + config.lastAttackerAsKillerConsiderationTimeout_ < System.currentTimeMillis()) {
victimCache.clearDamage();
return;
}
playerAttacker = lastAttacker.getPlayer().get();
}
Option<User> attackerOption = this.userManager.findByPlayer(playerAttacker);
if (attackerOption.isEmpty()) {
return;
}
User attacker = attackerOption.get();
UserCache attackerCache = attacker.getCache();
if (victim.equals(attacker)) {
victimCache.clearDamage();
return;
}
if (HookManager.WORLD_GUARD.isPresent()) {
WorldGuardHook worldGuard = HookManager.WORLD_GUARD.get();
if (worldGuard.isInNonPointsRegion(playerVictim.getLocation()) || worldGuard.isInNonPointsRegion(playerAttacker.getLocation())) {
victimCache.clearDamage();
return;
}
}
if (config.rankFarmingProtect) {
Long attackTimestamp = attackerCache.wasAttackerOf(victim);
Long victimTimestamp = attackerCache.wasVictimOf(attacker);
if (attackTimestamp != null) {
if (attackTimestamp + (config.rankFarmingCooldown * 1000L) >= System.currentTimeMillis()) {
ChatUtils.sendMessage(playerVictim, messages.rankLastVictimV);
ChatUtils.sendMessage(playerAttacker, messages.rankLastVictimA);
victimCache.clearDamage();
event.setDeathMessage(null);
return;
}
} else if (victimTimestamp != null) {
if (victimTimestamp + (config.rankFarmingCooldown * 1000L) >= System.currentTimeMillis()) {
ChatUtils.sendMessage(playerVictim, messages.rankLastAttackerV);
ChatUtils.sendMessage(playerAttacker, messages.rankLastAttackerA);
victimCache.clearDamage();
event.setDeathMessage(null);
return;
}
}
}
if (config.rankIPProtect) {
String attackerIP = playerAttacker.getAddress().getHostString();
if (attackerIP != null && attackerIP.equalsIgnoreCase(playerVictim.getAddress().getHostString())) {
ChatUtils.sendMessage(playerVictim, messages.rankIPVictim);
ChatUtils.sendMessage(playerAttacker, messages.rankIPAttacker);
victimCache.clearDamage();
event.setDeathMessage(null);
return;
}
}
int[] rankChanges = new int[2];
int victimPoints = victim.getRank().getPoints();
int attackerPoints = attacker.getRank().getPoints();
RankSystem.RankResult result = rankSystem.calculate(config.rankSystem, attackerPoints, victimPoints);
PointsChangeEvent attackerPointsChangeEvent = new PointsChangeEvent(EventCause.USER, attacker, attacker, result.getAttackerPoints());
PointsChangeEvent victimPointsChangeEvent = new PointsChangeEvent(EventCause.USER, attacker, victim, -result.getVictimPoints());
List<String> assistEntries = new ArrayList<>();
List<User> messageReceivers = new ArrayList<>();
int victimPointsBeforeChange = victim.getRank().getPoints();
if (SimpleEventHandler.handle(attackerPointsChangeEvent) && SimpleEventHandler.handle(victimPointsChangeEvent)) {
double attackerDamage = victimCache.killedBy(attacker);
if (config.assistEnable && victimCache.isAssisted()) {
double toShare = attackerPointsChangeEvent.getPointsChange() * (1 - config.assistKillerShare);
double totalDamage = victimCache.getTotalDamage() + attackerDamage;
int givenPoints = 0;
Map<User, Double> damage = MapUtil.sortByValue(victimCache.getDamage());
int assists = 0;
for (Entry<User, Double> assist : damage.entrySet()) {
User assistUser = assist.getKey();
double assistFraction = assist.getValue() / totalDamage;
int addedPoints = (int) Math.round(assistFraction * toShare);
if (addedPoints <= 0) {
continue;
}
if (config.assistsLimit > 0) {
if (assists >= config.assistsLimit) {
break;
}
assists++;
}
PointsChangeEvent assistPointsChangeEvent = new PointsChangeEvent(EventCause.USER, assistUser, assistUser, addedPoints);
if (!SimpleEventHandler.handle(assistPointsChangeEvent)) {
continue;
}
addedPoints = assistPointsChangeEvent.getPointsChange();
if (!config.broadcastDeathMessage) {
messageReceivers.add(assistUser);
}
givenPoints += addedPoints;
String assistEntry = StringUtils.replace(messages.rankAssistEntry, "{PLAYER}", assistUser.getName());
assistEntry = StringUtils.replace(assistEntry, "{+}", Integer.toString(addedPoints));
assistEntry = StringUtils.replace(assistEntry, "{SHARE}", ChatUtils.getPercent(assistFraction));
assistEntries.add(assistEntry);
int finalAddedPoints = addedPoints;
assistUser.getRank().updatePoints(currentValue -> currentValue + finalAddedPoints);
AssistsChangeEvent assistsChangeEvent = new AssistsChangeEvent(EventCause.USER, victim, assistUser, 1);
if (SimpleEventHandler.handle(assistsChangeEvent)) {
assistUser.getRank().updateAssists(currentValue -> currentValue + assistsChangeEvent.getAssistsChange());
}
}
double updatedAttackerPoints = attackerPointsChangeEvent.getPointsChange() - toShare + (givenPoints < toShare ? toShare - givenPoints : 0);
attackerPointsChangeEvent.setPointsChange((int) Math.round(updatedAttackerPoints));
}
attacker.getRank().updatePoints(currentValue -> currentValue + attackerPointsChangeEvent.getPointsChange());
KillsChangeEvent killsChangeEvent = new KillsChangeEvent(EventCause.USER, attacker, victim, 1);
if (SimpleEventHandler.handle(killsChangeEvent)) {
attacker.getRank().updateKills(currentValue -> currentValue + killsChangeEvent.getKillsChange());
}
attackerCache.registerVictim(victim);
victimPointsBeforeChange = victim.getRank().getPoints();
victim.getRank().updatePoints(currentValue -> currentValue + victimPointsChangeEvent.getPointsChange());
victimCache.registerKiller(attacker);
victimCache.clearDamage();
if (!config.broadcastDeathMessage) {
messageReceivers.add(attacker);
messageReceivers.add(victim);
}
}
ConcurrencyTaskBuilder taskBuilder = ConcurrencyTask.builder();
if (config.dataModel == DataModel.MYSQL) {
victim.getGuild().peek(guild -> taskBuilder.delegate(new DatabaseUpdateGuildPointsRequest(guild)));
attacker.getGuild().peek(guild -> taskBuilder.delegate(new DatabaseUpdateGuildPointsRequest(guild)));
taskBuilder.delegate(new DatabaseUpdateUserPointsRequest(victim));
taskBuilder.delegate(new DatabaseUpdateUserPointsRequest(attacker));
}
this.concurrencyManager.postTask(taskBuilder.delegate(new DummyGlobalUpdateUserRequest(victim)).delegate(new DummyGlobalUpdateUserRequest(attacker)).build());
Formatter killFormatter = new Formatter().register("{ATTACKER}", attacker.getName()).register("{VICTIM}", victim.getName()).register("{+}", Integer.toString(attackerPointsChangeEvent.getPointsChange())).register("{-}", Math.min(victimPointsBeforeChange, victimPointsChangeEvent.getPointsChange())).register("{POINTS-FORMAT}", NumberRange.inRangeToString(victimPoints, config.pointsFormat)).register("{POINTS}", Integer.toString(victim.getRank().getPoints())).register("{WEAPON}", MaterialUtils.getMaterialName(playerAttacker.getItemInHand().getType())).register("{WEAPON-NAME}", MaterialUtils.getItemCustomName(playerAttacker.getItemInHand())).register("{REMAINING-HEALTH}", String.format(Locale.US, "%.2f", playerAttacker.getHealth())).register("{REMAINING-HEARTS}", Integer.toString((int) (playerAttacker.getHealth() / 2))).register("{VTAG}", victim.getGuild().map(guild -> StringUtils.replace(config.chatGuild.getValue(), "{TAG}", guild.getTag())).orElseGet("")).register("{ATAG}", attacker.getGuild().map(guild -> StringUtils.replace(config.chatGuild.getValue(), "{TAG}", guild.getTag())).orElseGet("")).register("{ASSISTS}", config.assistEnable && !assistEntries.isEmpty() ? StringUtils.replace(messages.rankAssistMessage, "{ASSISTS}", String.join(messages.rankAssistDelimiter, assistEntries)) : "");
if (config.displayTitleNotificationForKiller) {
TitleMessage titleMessage = TitleMessage.builder().text(killFormatter.format(messages.rankKillTitle)).subText(killFormatter.format(messages.rankKillSubtitle)).fadeInDuration(config.notificationTitleFadeIn).stayDuration(config.notificationTitleStay).fadeOutDuration(config.notificationTitleFadeOut).build();
plugin.getNmsAccessor().getMessageAccessor().sendTitleMessage(titleMessage, playerAttacker);
}
String deathMessage = killFormatter.format(messages.rankDeathMessage);
if (config.broadcastDeathMessage) {
if (config.ignoreDisabledDeathMessages) {
for (Player player : event.getEntity().getWorld().getPlayers()) {
event.setDeathMessage(null);
ChatUtils.sendMessage(player, deathMessage);
}
} else {
event.setDeathMessage(deathMessage);
}
} else {
event.setDeathMessage(null);
for (User fighter : messageReceivers) {
fighter.sendMessage(deathMessage);
}
}
}
use of panda.std.Option in project FunnyGuilds by FunnyGuilds.
the class RankUtils method parseRank.
/**
* Parse legacy top placeholders (PTOP/GTOP-x) in text
*
* @param targetUser user for which text will be parsed
* @param text text to parse
* @return parsed text
*/
@Deprecated
public static String parseRank(PluginConfiguration config, TablistConfiguration tablistConfig, MessageConfiguration messages, UserRankManager userRankManager, GuildRankManager guildRankManager, User targetUser, String text) {
if (text == null) {
return null;
}
if (!text.contains("TOP-")) {
return text;
}
Matcher matcher = LEGACY_TOP_PATTERN.matcher(text);
if (matcher.find()) {
String topType = matcher.group(1);
String indexString = matcher.group(2);
int index;
try {
index = Integer.parseInt(indexString);
} catch (NumberFormatException ex) {
FunnyGuilds.getPluginLogger().error(indexString + "is invalid " + topType + " index!");
return text;
}
if (index < 1) {
FunnyGuilds.getPluginLogger().error("Index in " + topType + " must be greater or equal to 1!");
return text;
}
if (topType.equalsIgnoreCase("PTOP")) {
Option<User> userOption = userRankManager.getUser(DefaultTops.USER_POINTS_TOP, index);
if (userOption.isEmpty()) {
return StringUtils.replace(text, "{PTOP-" + index + "}", messages.ptopNoValue);
}
User user = userOption.get();
int points = user.getRank().getPoints();
String pointsFormat = config.ptopPoints.getValue();
if (!pointsFormat.isEmpty()) {
pointsFormat = pointsFormat.replace("{POINTS-FORMAT}", NumberRange.inRangeToString(points, config.pointsFormat));
pointsFormat = pointsFormat.replace("{POINTS}", String.valueOf(points));
}
return formatUserRank(config, text, "{PTOP-" + index + "}", targetUser, user, pointsFormat);
} else if (topType.equalsIgnoreCase("GTOP")) {
Option<Guild> guildOption = guildRankManager.getGuild(DefaultTops.GUILD_AVG_POINTS_TOP, index);
if (guildOption.isEmpty()) {
return StringUtils.replace(text, "{GTOP-" + index + "}", messages.gtopNoValue);
}
Guild guild = guildOption.get();
int points = guild.getRank().getAveragePoints();
String pointsFormat = config.gtopPoints.getValue();
if (!pointsFormat.isEmpty()) {
pointsFormat = pointsFormat.replace("{POINTS-FORMAT}", NumberRange.inRangeToString(points, config.pointsFormat));
pointsFormat = pointsFormat.replace("{POINTS}", String.valueOf(points));
}
return formatGuildRank(config, tablistConfig, text, "{GTOP-" + index + "}", targetUser, guild, pointsFormat);
}
}
return text;
}
use of panda.std.Option in project FunnyGuilds by FunnyGuilds.
the class RankUtils method parseTopPosition.
public static String parseTopPosition(PluginConfiguration config, MessageConfiguration messages, GuildRankManager guildRankManager, User targetUser, String text) {
if (text == null) {
return null;
}
if (!text.contains("POSITION-")) {
return text;
}
Matcher matcher = TOP_POSITION_PATTERN.matcher(text);
if (matcher.find()) {
String positionType = matcher.group(1);
String comparatorType = matcher.group(2);
if (positionType.equalsIgnoreCase("POSITION")) {
if (targetUser == null) {
return StringUtils.replace(text, "{POSITION}", "0");
}
return StringUtils.replace(text, "{POSITION-" + comparatorType + "}", Integer.toString(targetUser.getRank().getPosition(comparatorType)));
} else if (positionType.equalsIgnoreCase("G-POSITION")) {
if (targetUser == null) {
return StringUtils.replace(text, "{POSITION}", messages.minMembersToIncludeNoValue);
}
Option<Guild> guildOption = targetUser.getGuild();
if (guildOption.isEmpty()) {
return StringUtils.replace(text, "{G-POSITION-" + comparatorType + "}", messages.minMembersToIncludeNoValue);
}
Guild guild = guildOption.get();
return StringUtils.replace(text, "{G-POSITION-" + comparatorType + "}", guildRankManager.isRankedGuild(guild) ? Integer.toString(guild.getRank().getPosition(comparatorType)) : messages.minMembersToIncludeNoValue);
}
}
return text;
}
use of panda.std.Option in project cdn by dzikoysk.
the class CdnSerializer method serializeMember.
private Result<Blank, ? extends Exception> serializeMember(AnnotatedMember member, Section output) {
if (member.isIgnored()) {
return ok();
}
Result<Option<Object>, ReflectiveOperationException> propertyValueResult = member.getValue();
if (propertyValueResult.isErr()) {
return error(propertyValueResult.getError());
}
List<String> description = PandaStream.of(member.getAnnotationsByType(Description.class)).flatMap(annotation -> Arrays.asList(annotation.value())).toList();
if (description.isEmpty()) {
description.addAll(PandaStream.of(member.getAnnotationsByType(Descriptions.class)).flatMapStream(descriptions -> Arrays.stream(descriptions.value())).flatMapStream(descriptions -> Arrays.stream(descriptions.value())).toList());
}
Option<Object> propertyValue = propertyValueResult.get();
if (member.isAnnotationPresent(Contextual.class)) {
Section section = new Section(description, StandardOperators.OBJECT_SEPARATOR, member.getName());
output.append(section);
return serialize(propertyValue.get(), section).mapToBlank();
}
return propertyValue.map(value -> CdnUtils.findComposer(settings, member.getType(), member.getAnnotatedType(), member).flatMap(serializer -> serializer.serialize(settings, description, member.getName(), member.getAnnotatedType(), value)).peek(output::append).mapToBlank()).orElseGet(Result.ok());
}
use of panda.std.Option in project EternalCore by EternalCodeTeam.
the class InventoryOpenCommand method createInventory.
@IgnoreMethod
private Gui createInventory(Player player) {
Gui gui = Gui.gui().rows(1).title(ChatUtils.component("Armor player: " + player.getName())).create();
if (player.getInventory().getHelmet() != null) {
gui.setItem(0, new GuiItem(player.getInventory().getHelmet()));
}
if (player.getInventory().getChestplate() != null) {
gui.setItem(1, new GuiItem(player.getInventory().getChestplate()));
}
if (player.getInventory().getLeggings() != null) {
gui.setItem(2, new GuiItem(player.getInventory().getLeggings()));
}
if (player.getInventory().getBoots() != null) {
gui.setItem(3, new GuiItem(player.getInventory().getBoots()));
}
GuiItem empty = new GuiItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE));
for (int i = 4; i < 9; i++) {
gui.setItem(i, empty);
}
gui.setDefaultClickAction(event -> {
Option<ItemStack> itemStackOption = Option.of(event.getCurrentItem());
itemStackOption.filter(itemStack -> itemStack.getType() == Material.GRAY_STAINED_GLASS_PANE).peek(itemStack -> event.setCancelled(true));
});
gui.setCloseGuiAction(event -> {
Inventory inventory = event.getInventory();
String title = event.getView().getTitle();
String playerString = title.replace("Armor player: ", "");
Option<Player> playerOption = Option.of(this.server.getPlayer(playerString));
playerOption.peek(playerPeek -> {
playerPeek.getInventory().setHelmet(inventory.getItem(0));
playerPeek.getInventory().setChestplate(inventory.getItem(1));
playerPeek.getInventory().setLeggings(inventory.getItem(2));
playerPeek.getInventory().setBoots(inventory.getItem(3));
playerPeek.updateInventory();
});
});
return gui;
}
Aggregations