Пример #1
0
 /**
  * Unregisters a node.
  *
  * @param node The node to remove.
  */
 public void unregister(Node node) {
   logger.info("Unregistering node : World-" + node.getId() + ".");
   nodes.remove(node.getId());
   for (PlayerData p : node.getPlayers()) {
     players.remove(p.getName());
   }
 }
Пример #2
0
 public boolean checkConnection(String usr) {
   if (trackplayers.containsKey(usr)) {
     PlayerData mp = (PlayerData) trackplayers.get(usr);
     if (mp.connectedForLonger()) {
       return true;
     }
   }
   return false;
 }
  private void handleNpeDeath(Entity subject) {
    EntityDamageEvent cause = subject.getLastDamageCause();

    // Increment the NPE's total death stat
    NpeData npeData = this.plugin.getNpeDataByClass(subject.getClass());
    npeData.incTotalDeaths();

    // Increment the ServerData statistics
    plugin.serverData.incNpesKilled();

    if (cause instanceof EntityDamageByEntityEvent) {
      Entity predicate = ((EntityDamageByEntityEvent) cause).getDamager();
      if (predicate instanceof Player) {
        // The NPE was killed by a player, reward them for their accomplishments
        PlayerData killerData = this.plugin.getPlayerData(((Player) predicate).getName(), "");
        String mobName = this.plugin.getSimpleClassName(subject.getClass()).toLowerCase();

        if (mobName.startsWith("craft")) {
          // it looks like a lot of the class names follow the format "CraftX", such as "CraftWolf"
          // or "CraftCreeper"
          mobName = mobName.substring(5);
        }

        if (killerData.getMobsKilled().containsKey(mobName)) {
          killerData.incMobsKilled(mobName);
        } else {
          plugin.log.info("MineJMX: A player killed an unknown mob type (\"" + mobName + "\")");
        }

        // and increment the NPE's specific death stat
        npeData.incDeathsByPlayer();
      } else {
        // The NPE was killed by another mob, increment NpeData statistics again
        NpeData killerData = this.plugin.getNpeDataByClass(predicate.getClass());
        killerData.incNpesKilled();

        // and increment the original NPE's specific death stat
        npeData.incDeathsByNpe();
      }
    } else if (cause instanceof EntityDamageByBlockEvent) {
      // killed by environment, increment the specific death counter
      npeData.incDeathsByEnvironment();
    } else {
      // drowned, burned, fell, etc...increment the environmental death counter
      switch (cause.getCause()) {
        case CONTACT:
        case DROWNING:
        case FALL:
        case FIRE:
        case FIRE_TICK:
        case LAVA:
        case LIGHTNING:
          npeData.incDeathsByEnvironment();
          break;
      }
    }
  }
  // when a vehicle is damaged
  @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST)
  public void onVehicleDamage(VehicleDamageEvent event) {
    // all of this is anti theft code
    if (!GriefPrevention.instance.config_claims_preventTheft) return;

    // determine which player is attacking, if any
    Player attacker = null;
    Entity damageSource = event.getAttacker();
    if (damageSource instanceof Player) {
      attacker = (Player) damageSource;
    } else if (damageSource instanceof Arrow) {
      Arrow arrow = (Arrow) damageSource;
      if (arrow.getShooter() instanceof Player) {
        attacker = (Player) arrow.getShooter();
      }
    } else if (damageSource instanceof ThrownPotion) {
      ThrownPotion potion = (ThrownPotion) damageSource;
      if (potion.getShooter() instanceof Player) {
        attacker = (Player) potion.getShooter();
      }
    }

    // NOTE: vehicles can be pushed around.
    // so unless precautions are taken by the owner, a resourceful thief might find ways to steal
    // anyway
    Claim cachedClaim = null;
    PlayerData playerData = null;
    if (attacker != null) {
      playerData = this.dataStore.getPlayerData(attacker.getName());
      cachedClaim = playerData.lastClaim;
    }

    Claim claim = this.dataStore.getClaimAt(event.getVehicle().getLocation(), false, cachedClaim);

    // if it's claimed
    if (claim != null) {
      // if damaged by anything other than a player, cancel the event
      if (attacker == null) {
        event.setCancelled(true);
      }

      // otherwise the player damaging the entity must have permission
      else {
        String noContainersReason = claim.allowContainers(attacker);
        if (noContainersReason != null) {
          event.setCancelled(true);
          GriefPrevention.sendMessage(
              attacker, TextMode.Err, Messages.NoDamageClaimedEntity, claim.getOwnerName());
        }

        // cache claim for later
        if (playerData != null) {
          playerData.lastClaim = claim;
        }
      }
    }
  }
Пример #5
0
 public Mail(PlayerData sender, PlayerData receiver, String subject, String message) {
   receiverid = receiver.getId();
   receivername = receiver.getName();
   senderid = sender.getId();
   sendername = sender.getName();
   this.subject = subject;
   this.message = message;
   this.sentdate = System.currentTimeMillis();
   this.readdate = 0;
 }
Пример #6
0
 @Override
 protected PlayerData clone() {
   try {
     PlayerData clone = (PlayerData) super.clone();
     clone.gameStats = clone.gameStats.clone();
     clone.globalStats = clone.globalStats.clone();
     return clone;
   } catch (CloneNotSupportedException e) {
     throw new IllegalStateException(e);
   }
 }
Пример #7
0
  @SuppressWarnings("rawtypes")
  public long getFullPlayTime() {
    long activePlayTime = 0;

    for (Iterator i = this.plugin.playerData.entrySet().iterator(); i.hasNext(); ) {
      PlayerData player = (PlayerData) ((Map.Entry) i.next()).getValue();
      if (1 == player.getActive()) {
        activePlayTime += player.timeSinceLogin();
      }
    }

    return activePlayTime + this.playTime;
  }
Пример #8
0
  public void update(GameContainer gc, StateBasedGame sbg, EnemyManager enemyManager, int delta) {
    if (this.currentWave < this.waves.length) {
      if (!this.waveOver) {
        if (this.waves[this.currentWave].isOver()) {
          this.waveOver = true;
          this.nextWaveIn = WaveManager.TIMEBETWEENWAVES;
          // wave is over, check to see if the player lost any health, if not increase their
          // multiplier by 1
          if (this.healthStart <= PlayerData.health) PlayerData.increaseMultiplier(1);
          this.healthStart = PlayerData.health;

          if ((this.currentWave + 1) == this.waves.length) {
            this.wavesFinished = true;
          }

        } else {
          this.waves[this.currentWave].update(gc, sbg, enemyManager, delta);
        }
      } else {
        // wave is over start counting down until next wave
        this.nextWaveIn -= delta;
        if (this.nextWaveIn <= 0) {
          this.currentWave++;
          this.waveOver = false;
        }
      }
    } else {
      this.wavesFinished = true;
    }
  }
Пример #9
0
  private void send(Player player, MessageNode node, String message) {
    switch (messages.getCat(node)) {
      case NOTIFICATION:
        if (player == null) {
          plugin.getLogger().warning("Could not send the following message: " + message);
        } else {
          // FEATURE: don't spam messages
          PlayerData playerData =
              plugin.getModuleForClass(DataStoreModule.class).getPlayerData(player.getName());
          long now = Calendar.getInstance().getTimeInMillis();

          if (!node.equals(playerData.lastMessageSent)
              || now - playerData.lastMessageTimestamp > 30000) {
            if (popupsAreEnabled(MsgCategory.NOTIFICATION))
              sendPopup(player, MsgCategory.NOTIFICATION, message);
            else player.sendMessage(message);
            playerData.lastMessageSent = node;
            playerData.lastMessageTimestamp = now;
          }
        }
        break;
      case TUTORIAL:
        Validate.notNull(player);
        if (persistModule.getCountFor(node, player.getName()) < messages.getMsgCount(node)) {
          long now = Calendar.getInstance().getTimeInMillis();

          if (!timeouts.contains(player.getName(), node)
              || now - timeouts.get(player.getName(), node) > 120000) // only if contains
          {
            timeouts.put(player.getName(), node, now);
            String msgText = messages.getString(node);
            if (manager != null) sendPopup(player, MsgCategory.TUTORIAL, msgText);
            else
              player.sendMessage(
                  ChatColor.DARK_RED + plugin.getTag() + ChatColor.WHITE + " " + msgText);
            persistModule.increment(node, player.getName());
          }
        } else timeouts.remove(player, message);
        break;
      case BROADCAST:
        plugin.getServer().broadcastMessage(message);
        break;
      default:
        throw new UnsupportedOperationException(messages.getCat(node) + " not implemented");
    }
  }
  public String allowBuild(Player player, Location location) {
    PlayerData playerData = this.dataStore.getPlayerData(player.getName());
    Claim claim = this.dataStore.getClaimAt(location, false, playerData.lastClaim);
    WorldConfig wc = GriefPrevention.instance.getWorldCfg(player.getWorld());
    // exception: administrators in ignore claims mode and special player accounts created by server
    // mods
    if (playerData.ignoreClaims || wc.getModsIgnoreClaimsAccounts().contains(player.getName()))
      return null;

    // wilderness rules
    if (claim == null) {
      // no building in the wilderness in creative mode
      if (this.creativeRulesApply(location)) {
        String reason =
            this.dataStore.getMessage(Messages.NoBuildOutsideClaims)
                + "  "
                + this.dataStore.getMessage(Messages.CreativeBasicsDemoAdvertisement);
        if (player.hasPermission("griefprevention.ignoreclaims"))
          reason += "  " + this.dataStore.getMessage(Messages.IgnoreClaimsAdvertisement);
        return reason;
      }

      // no building in survival wilderness when that is configured
      else if (wc.getApplyTrashBlockRules() && wc.getClaimsEnabled()) {
        if (wc.getTrashBlockPlacementBehaviour().Allowed(location, player).Denied())
          return this.dataStore.getMessage(Messages.NoBuildOutsideClaims)
              + "  "
              + this.dataStore.getMessage(Messages.SurvivalBasicsDemoAdvertisement);
        else return null;
      } else {
        // but it's fine in creative
        return null;
      }
    }

    // if not in the wilderness, then apply claim rules (permissions, etc)
    else {
      // cache the claim for later reference
      playerData.lastClaim = claim;
      return claim.allowBuild(player);
    }
  }
Пример #11
0
  private void denyAlts(List<PlayerData> duplicates, final UUID uuid) throws SQLException {
    if (plugin.getPlayerBanStorage().isBanned(uuid)) {
      return;
    }

    for (final PlayerData player : duplicates) {
      if (player.getUUID().equals(uuid)) {
        continue;
      }

      final PlayerBanData ban = plugin.getPlayerBanStorage().getBan(player.getUUID());

      if (ban == null) {
        continue;
      }
      if (ban.hasExpired()) {
        continue;
      }

      plugin
          .getServer()
          .getScheduler()
          .runTask(
              plugin,
              new Runnable() {

                @Override
                public void run() {
                  Player bukkitPlayer = plugin.getServer().getPlayer(uuid);

                  Message kickMessage =
                      Message.get("denyalts.player.disallowed")
                          .set("player", player.getName())
                          .set("reason", ban.getReason())
                          .set("actor", ban.getActor().getName());

                  bukkitPlayer.kickPlayer(kickMessage.toString());
                }
              });
    }
  }
  private void handlePlayerDeath(Player subject) {
    EntityDamageEvent cause = subject.getLastDamageCause();

    // Increment the PlayerData total death stat
    PlayerData playerData =
        this.plugin.getPlayerData(subject.getName(), "MineJMX found a new Player");
    playerData.incDeaths();

    // Increment the ServerData statistics
    plugin.serverData.incPlayersKilled();

    if (cause instanceof EntityDamageByEntityEvent) {
      Entity predicate = ((EntityDamageByEntityEvent) cause).getDamager();
      if (predicate instanceof Player) {
        // The player was killed by another player, dick move bro
        PlayerData killerData = this.plugin.getPlayerData(((Player) predicate).getName(), "");
        killerData.incPlayersKilled();

        // Increment the victim's PvP death stat
        playerData.incDeathsByPlayer();
      } else {
        // The player was killed by a mob, increment the NpeData statistics
        NpeData killerData = this.plugin.getNpeDataByClass(predicate.getClass());
        killerData.incPlayersKilled();

        // Increment the victim's death by NPE stat
        playerData.incDeathsByNpe();
      }
    } else if (cause instanceof EntityDamageByBlockEvent) {
      // as it turns out this is only valid for cacti/lava...it might be
      //    completely obsolete in favor of the following switch statement,
      //    but I'm going to leave it in for the time being just in case
      playerData.incDeathsByEnvironment();
    } else {
      // drowned, burned, fell, etc...increment the environmental death counter
      switch (cause.getCause()) {
        case CONTACT:
        case DROWNING:
        case FALL:
        case FIRE:
        case FIRE_TICK:
        case LAVA:
        case LIGHTNING:
          playerData.incDeathsByEnvironment();
          break;
      }
    }
  }
  // called when a player spawns, applies protection for that player if necessary
  public void checkPvpProtectionNeeded(Player player) {
    WorldConfig wc = GriefPrevention.instance.getWorldCfg(player.getWorld());
    // if pvp is disabled, do nothing
    if (!player.getWorld().getPVP()) return;

    // if player is in creative mode, do nothing
    if (player.getGameMode() == GameMode.CREATIVE) return;

    // if anti spawn camping feature is not enabled, do nothing
    if (!wc.getProtectFreshSpawns()) return;

    // if the player has the damage any player permission enabled, do nothing
    if (player.hasPermission("griefprevention.nopvpimmunity")) return;

    // check inventory for well, anything
    PlayerInventory inventory = player.getInventory();
    ItemStack[] armorStacks = inventory.getArmorContents();

    // check armor slots, stop if any items are found
    for (int i = 0; i < armorStacks.length; i++) {
      if (!(armorStacks[i] == null || armorStacks[i].getType() == Material.AIR)) return;
    }

    // check other slots, stop if any items are found
    ItemStack[] generalStacks = inventory.getContents();
    for (int i = 0; i < generalStacks.length; i++) {
      if (!(generalStacks[i] == null || generalStacks[i].getType() == Material.AIR)) return;
    }

    // otherwise, apply immunity
    PlayerData playerData = this.dataStore.getPlayerData(player.getName());
    playerData.pvpImmune = true;

    // inform the player
    GriefPrevention.sendMessage(player, TextMode.Success, Messages.PvPImmunityStart);
  }
Пример #14
0
  private void punishAlts(List<PlayerData> duplicates, UUID uuid) throws SQLException {

    if (!plugin.getPlayerBanStorage().isBanned(uuid)) {
      // Auto ban
      for (PlayerData player : duplicates) {
        if (player.getUUID().equals(uuid)) {
          continue;
        }

        PlayerBanData ban = plugin.getPlayerBanStorage().getBan(player.getUUID());

        if (ban == null) {
          continue;
        }
        if (ban.hasExpired()) {
          continue;
        }

        final PlayerBanData newBan =
            new PlayerBanData(
                plugin.getPlayerStorage().queryForId(UUIDUtils.toBytes(uuid)),
                plugin.getPlayerStorage().getConsole(),
                ban.getReason(),
                ban.getExpires());

        plugin.getPlayerBanStorage().ban(newBan, false);

        plugin
            .getServer()
            .getScheduler()
            .runTask(
                plugin,
                new Runnable() {

                  @Override
                  public void run() {
                    Player bukkitPlayer =
                        plugin.getServer().getPlayer(newBan.getPlayer().getUUID());

                    Message kickMessage =
                        Message.get("ban.player.kick")
                            .set("displayName", bukkitPlayer.getDisplayName())
                            .set("player", newBan.getPlayer().getName())
                            .set("reason", newBan.getReason())
                            .set("actor", newBan.getActor().getName());

                    bukkitPlayer.kickPlayer(kickMessage.toString());
                  }
                });
      }
    } else if (!plugin.getPlayerMuteStorage().isMuted(uuid)) {
      // Auto mute
      for (PlayerData player : duplicates) {
        if (player.getUUID().equals(uuid)) {
          continue;
        }

        PlayerMuteData mute = plugin.getPlayerMuteStorage().getMute(player.getUUID());

        if (mute == null) {
          continue;
        }
        if (mute.hasExpired()) {
          continue;
        }

        PlayerMuteData newMute =
            new PlayerMuteData(
                plugin.getPlayerStorage().queryForId(UUIDUtils.toBytes(uuid)),
                plugin.getPlayerStorage().getConsole(),
                mute.getReason(),
                mute.isSoft(),
                mute.getExpires());

        plugin.getPlayerMuteStorage().mute(newMute, false);
      }
    }
  }
Пример #15
0
  private void handleJoinDeny(PlayerData player, String reason) {
    Message message =
        Message.get("deniedNotify.player").set("player", player.getName()).set("reason", reason);

    CommandUtils.broadcast(message.toString(), "bm.notify.denied.player");
  }
Пример #16
0
 /**
  * Registers a player.
  *
  * @param player The player.
  * @param node The node.
  */
 public void register(PlayerData player, Node node) {
   logger.info("Registering player : " + player.getName() + "...");
   players.put(player.getName(), node);
   node.register(player);
 }
Пример #17
0
 public static void registerScoreboard(Player player, int priority, Scoreboard scoreboard) {
   PlayerData playerData = getPlayerData(player.getName());
   playerData.registerScoreboard(player, priority, scoreboard);
 }
Пример #18
0
 /**
  * Unregisters a player.
  *
  * @param player The player.
  */
 public void unregister(PlayerData player) {
   logger.info("Unregistering player : " + player.getName() + "...");
   if (players.containsKey(player.getName())) {
     players.remove(player.getName()).unregister(player);
   }
 }
Пример #19
0
  @Override
  public void onPlayerInteract(PlayerInteractEvent event) {
    if (event.isCancelled()) return;

    final Player player = event.getPlayer();
    String playerName = player.getName();
    if (!plugin.getPlayerData().containsKey(playerName)) {
      plugin.getPlayerData().put(playerName, new PlayerData(plugin, playerName));
    }

    // If our user is select & is not holding an item, selection time
    if (plugin.getPlayerData().get(playerName).isSelecting()
        && player.getItemInHand().getType() == Material.AIR
        && event.getClickedBlock().getType() == Material.WOODEN_DOOR) {
      int x, y, z;
      Location loc = event.getClickedBlock().getLocation();
      x = loc.getBlockX();
      y = loc.getBlockY();
      z = loc.getBlockZ();
      PlayerData pData = plugin.getPlayerData().get(playerName);
      Door door = (Door) event.getClickedBlock().getState().getData();
      if (door.isTopHalf()) y = y - 1;
      if (event.getAction() == Action.LEFT_CLICK_BLOCK) {

        if (Inn.doorAlreadyExists(x, y, z)) {
          player.sendMessage(ChatColor.RED + "This door is already registered!");
          return;
        }
        int[] xyz = {x, y, z};
        pData.setPositionA(xyz);
        player.sendMessage(ChatColor.DARK_AQUA + "Door selected");
        event.setCancelled(true);
        if (pData.getPositionA() != null) {
          player.sendMessage(
              ChatColor.DARK_AQUA
                  + "Type "
                  + ChatColor.WHITE
                  + "/inn create [Price]"
                  + ChatColor.DARK_AQUA
                  + ", if you're happy with your selection, otherwise keep selecting!");
        }
      }
      // Are we trying to delete a door?
    } else if (plugin.getPlayerData().get(playerName).isRemoving()
        && player.getItemInHand().getType() == Material.AIR
        && event.getClickedBlock().getType() == Material.WOODEN_DOOR) {
      int x, y, z;
      Location loc = event.getClickedBlock().getLocation();
      x = loc.getBlockX();
      y = loc.getBlockY();
      z = loc.getBlockZ();
      Door door = (Door) event.getClickedBlock().getState().getData();
      if (door.isTopHalf()) y = y - 1;
      if (event.getAction() == Action.LEFT_CLICK_BLOCK) {
        event.setCancelled(true);
        if (Inn.doorAlreadyExists(x, y, z)) {
          if (!IPermissions.permission(player, "inn.admin.delete", player.isOp())) {
            if (!Inn.getOwner(x, y, z).equalsIgnoreCase(playerName)) {
              player.sendMessage(ChatColor.RED + "You do not own this door!");
              return;
            }
          }
          String query = "DELETE FROM doors WHERE x=" + x + " AND y=" + y + " AND z=" + z;
          Inn.manageSQLite.deleteQuery(query);
          player.sendMessage(ChatColor.RED + "This Inn door has been deleted!");
          return;
        } else {
          player.sendMessage(ChatColor.RED + "This door is not a Inn door!");
        }
      }
      // Are we trying to open a door?
    } else if (event.getClickedBlock().getType() == Material.WOODEN_DOOR) {
      if (IPermissions.permission(player, "inn.bypass", player.isOp())) return;
      int x, y, z;
      Location loc = event.getClickedBlock().getLocation();
      x = loc.getBlockX();
      y = loc.getBlockY();
      z = loc.getBlockZ();
      Door door = (Door) event.getClickedBlock().getState().getData();
      if (door.isTopHalf()) y = y - 1;
      if (Inn.doorAlreadyExists(x, y, z)) {
        String owner = Inn.getOwner(x, y, z);
        if (owner.equalsIgnoreCase(playerName)) {
          player.sendMessage(ChatColor.GREEN + "This is your inn door!");
          return;
        }
        int price = Inn.getDoorPrice(x, y, z);
        if (Inn.isTimeoutExpired(x, y, z, playerName)) {
          MethodAccount playerAccount = plugin.Method.getAccount(playerName);
          if (playerAccount.hasEnough(price)) {
            playerAccount.subtract(price);
            MethodAccount playerAccount2 = plugin.Method.getAccount(owner);
            playerAccount2.add(price);
            Inn.addTimeout(x, y, z, playerName);
            player.sendMessage(ChatColor.DARK_AQUA + "You are entering " + owner + " inn room");

          } else event.setCancelled(true);
        } else return;
      }
    }
  }
Пример #20
0
  public void playerLoader(MenuApp menuApp, Screen screen, String map) {

    AssetManager as = menuApp.getAssetManager();

    PlayerDataManager pdm = PlayerDataManager.load(as);
    PlayerDataMapManager pdmm = PlayerDataMapManager.load(as, map);

    ArrayList<PlayerData> list = pdm.getPlayer();

    int id = 0;

    int countTeams = 0;
    for (int i = 0; i < list.size(); i++) {
      PlayerData playerData = list.get(i);

      PlayerDataMap playerDataMap = pdmm.getPlayer().get(playerData.getId());

      if (playerDataMap != null) {
        if (playerDataMap.getController() != PlayerDataMap.none) {
          countTeams++;
        }
      }
    }

    for (int i = 0; i < list.size(); i++) {
      PlayerData playerData = list.get(i);
      PlayerDataMap playerDataMap = pdmm.getPlayer().get(playerData.getId());

      if (playerDataMap != null) {
        if (playerDataMap.getController() != PlayerDataMap.none) {
          id++;

          CustomControlCreator createMultiplayerPanel =
              new CustomControlCreator("myPlayerPanel", "playerPanel");
          de.lessvoid.nifty.elements.Element e =
              createMultiplayerPanel.create(nifty, screen, screen.findElementByName("slot" + i));

          TextField tf = e.findNiftyControl("id", TextField.class);
          tf.setText(id + "");
          tf.setEnabled(false);

          tf = e.findNiftyControl("playername", TextField.class);
          tf.setText(playerData.getName());
          tf.setEnabled(false);

          DropDown dd = e.findNiftyControl("team", DropDown.class);
          for (int b = 0; b < countTeams; b++) {
            dd.addItem("Team " + (b + 1));
          }
          // dd.setEnabled(false);

          PanelRenderer colorPanel = e.findElementByName("color").getRenderer(PanelRenderer.class);
          Color color =
              new Color(
                  playerData.getColor().r,
                  playerData.getColor().g,
                  playerData.getColor().b,
                  playerData.getColor().a);
          colorPanel.setBackgroundColor(color);
        }
      }
    }
  }
Пример #21
0
 public void restorePlayerToData(PlayerData data) {
   data.restorePlayer(this);
 }
Пример #22
0
 public PlayerData getPlayerData() {
   return PlayerData.extractData(this);
 }
  // when an entity is damaged
  @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST)
  public void onEntityDamage(EntityDamageEvent event) {
    // only actually interested in entities damaging entities (ignoring environmental damage)
    if (!(event instanceof EntityDamageByEntityEvent)) return;

    // monsters are never protected
    if (event.getEntity() instanceof Monster) return;

    EntityDamageByEntityEvent subEvent = (EntityDamageByEntityEvent) event;

    // determine which player is attacking, if any
    Player attacker = null;
    Entity damageSource = subEvent.getDamager();
    if (damageSource instanceof Player) {
      attacker = (Player) damageSource;
    } else if (damageSource instanceof Arrow) {
      Arrow arrow = (Arrow) damageSource;
      if (arrow.getShooter() instanceof Player) {
        attacker = (Player) arrow.getShooter();
      }
    } else if (damageSource instanceof ThrownPotion) {
      ThrownPotion potion = (ThrownPotion) damageSource;
      if (potion.getShooter() instanceof Player) {
        attacker = (Player) potion.getShooter();
      }
    }

    // if the attacker is a player and defender is a player (pvp combat)
    if (attacker != null && event.getEntity() instanceof Player) {
      // FEATURE: prevent pvp in the first minute after spawn, and prevent pvp when one or both
      // players have no inventory

      // doesn't apply when the attacker has the no pvp immunity permission
      // this rule is here to allow server owners to have a world with no spawn camp protection by
      // assigning permissions based on the player's world
      if (attacker.hasPermission("griefprevention.nopvpimmunity")) return;

      Player defender = (Player) (event.getEntity());

      PlayerData defenderData =
          this.dataStore.getPlayerData(((Player) event.getEntity()).getName());
      PlayerData attackerData = this.dataStore.getPlayerData(attacker.getName());

      // otherwise if protecting spawning players
      if (GriefPrevention.instance.config_pvp_protectFreshSpawns) {
        if (defenderData.pvpImmune) {
          event.setCancelled(true);
          GriefPrevention.sendMessage(attacker, TextMode.Err, Messages.ThatPlayerPvPImmune);
          return;
        }

        if (attackerData.pvpImmune) {
          event.setCancelled(true);
          GriefPrevention.sendMessage(attacker, TextMode.Err, Messages.CantFightWhileImmune);
          return;
        }
      }

      // FEATURE: prevent players who very recently participated in pvp combat from hiding inventory
      // to protect it from looting
      // FEATURE: prevent players who are in pvp combat from logging out to avoid being defeated

      long now = Calendar.getInstance().getTimeInMillis();
      defenderData.lastPvpTimestamp = now;
      defenderData.lastPvpPlayer = attacker.getName();
      attackerData.lastPvpTimestamp = now;
      attackerData.lastPvpPlayer = defender.getName();
    }

    // FEATURE: protect claimed animals, boats, minecarts
    // NOTE: animals can be lead with wheat, vehicles can be pushed around.
    // so unless precautions are taken by the owner, a resourceful thief might find ways to steal
    // anyway

    // if theft protection is enabled
    if (event instanceof EntityDamageByEntityEvent) {
      // if the entity is an non-monster creature (remember monsters disqualified above), or a
      // vehicle
      if ((subEvent.getEntity() instanceof Creature
          && GriefPrevention.instance.config_claims_protectCreatures)) {
        Claim cachedClaim = null;
        PlayerData playerData = null;
        if (attacker != null) {
          playerData = this.dataStore.getPlayerData(attacker.getName());
          cachedClaim = playerData.lastClaim;
        }

        Claim claim =
            this.dataStore.getClaimAt(event.getEntity().getLocation(), false, cachedClaim);

        // if it's claimed
        if (claim != null) {
          // if damaged by anything other than a player, cancel the event
          if (attacker == null) {
            event.setCancelled(true);
          }

          // otherwise the player damaging the entity must have permission
          else {
            String noContainersReason = claim.allowContainers(attacker);
            if (noContainersReason != null) {
              event.setCancelled(true);
              GriefPrevention.sendMessage(
                  attacker, TextMode.Err, Messages.NoDamageClaimedEntity, claim.getOwnerName());
            }

            // cache claim for later
            if (playerData != null) {
              playerData.lastClaim = claim;
            }
          }
        }
      }
    }
  }
Пример #24
0
 /**
  * Registers a new player.
  *
  * @param player The player to add.
  */
 public void register(PlayerData player) {
   players.put(player.getName(), player);
 }
Пример #25
0
 public static void unregisterScoreboard(Player player, int priority) {
   PlayerData playerData = getPlayerData(player.getName());
   playerData.unregisterScoreboard(player, priority);
 }
Пример #26
0
 /**
  * Removes an old player.
  *
  * @param player The player to remove.
  */
 public void unregister(PlayerData player) {
   players.remove(player.getName());
 }
Пример #27
0
  // Processes placing and breaking of gold blocks in the inner sanctum (treasury)
  public boolean processGoldBlock(BlockEvent rawEvent) {
    // Block broken (withdrawl or theft)
    if (rawEvent instanceof BlockBreakEvent) {
      BlockBreakEvent event = (BlockBreakEvent) rawEvent;
      Player player = event.getPlayer();
      PlayerData playerData = plugin.players.get(player.getName());

      // Town resident
      if (playerData.townName.equals(this.name)) {
        // Make sure the player has enough blocks deposited
        if (playerData.treasuryBlocks < 1) {
          plugin.message.send(player, "You don't have any gold blocks deposited in the treasury.");
          return false;
        } else {
          playerData.treasuryBlocks--;
          playerData.update();
          plugin.message.parse(
              player,
              "You now have "
                  + playerData.treasuryBlocks
                  + " block"
                  + (playerData.treasuryBlocks == 1 ? "" : "s")
                  + " deposited into the treasury.",
              ChatColor.GOLD);
          return true;
        }
      }
    } else if (rawEvent instanceof BlockPlaceEvent) {
      BlockPlaceEvent event = (BlockPlaceEvent) rawEvent;
      Player player = event.getPlayer();
      PlayerData playerData = plugin.players.get(player.getName());

      // Town resident
      if (playerData.townName.equals(this.name)) {
        // Neutral town are not allowed to have treasuries
        if (this.id_Faction == 0) {
          plugin.message.send(player, "Neutral towns cannot use treasury blocks.");
          return false;
        }
        if (this.townLevel.treasuryLevel == 0) {
          plugin.message.send(
              player,
              this.townLevel.name
                  + "s are not allowed treasury blocks - upgrade your town to create income.");
          return false;
        }

        // See if the placement would exceed the town's treasury level
        if (playerData.treasuryBlocks + 1 > this.townLevel.treasuryLevel) {
          plugin.message.parse(
              player,
              "Your town only allows "
                  + this.townLevel.treasuryLevel
                  + " treasury block"
                  + (this.townLevel.treasuryLevel == 1 ? "" : "s")
                  + " per resident.");
          return false;
        } else {
          playerData.treasuryBlocks++;
          playerData.update();
          plugin.message.parse(
              player,
              "You now have "
                  + playerData.treasuryBlocks
                  + " block"
                  + (playerData.treasuryBlocks == 1 ? "" : "s")
                  + " deposited into the treasury.",
              ChatColor.GOLD);
          return true;
        }
      }
    }
    // TODO Auto-generated method stub
    return false;
  }