->Fixed a bug where players would randomly lose items permanently from the buyback screen by clicking around on the bottom inventory. ->Zombie Leaders no longer randomly have very low amounts of health. ->World shop Purchase messages now survive server restarts so players are aware of all items that were sold. ->Purchasing items from shops now attempts to gives you the item in your inventory directly rather than just dropping it on the ground. ->Localize all Music Discs properly. ->Skulls and Heads have been localized. ->Add a sound for when Deadly Creepers get primed to explode. (Make the sound consistent with Hellfires.) ->Items dropped after a player dies and buys back items will be invulnerable to fires, explosions, etc. ->Fire effects and explosions for Hellfire monsters and angry Creepers has been dramatically reduced! ->Global attack cooldown against Elite monsters reduced from 2.00 seconds to 1.75 seconds. ->Custom arrows no longer show an irrelevant potion effect type in their description. ->Party system has been revamped to be distance-based instead of region-based. Players can be up to 32 blocks away from each other to be considered in the same party. Parties that are nearby other parties will automatically have their parties combined. ->Party bonuses are now applied for each 'additional' party member, not for total party members. (Before you would get +20% Damage / Defense with you and one other party member. Now you only get +10% Damage / Defense.) ->Added IsInSameParty(p,p2), isSetItem(item), getItemSet(item), getItemTier(item) to API. ->Fix Defender Damage Reduction for other party members. ->Zombies can now hold decorative shields. ->Shields display properly when linked in chat now. ->Fixed a bug where respawning on a location with a Nether Portal prevented you from buying back items. ->Bow Artifact Experience is now buffered and held back until you are no longer in combat to prevent the bow from cancelling drawbacks due to XP updates. ->Fixed Lifesteal not being able to fully heal a player.dev
parent
c4e49639c6
commit
f8efbec088
Binary file not shown.
@ -1,230 +0,0 @@ |
||||
package sig.plugin.TwosideKeeper; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
import org.bukkit.Bukkit; |
||||
import org.bukkit.ChatColor; |
||||
import org.bukkit.Color; |
||||
import org.bukkit.Location; |
||||
import org.bukkit.entity.Player; |
||||
import org.bukkit.scoreboard.DisplaySlot; |
||||
|
||||
import sig.plugin.TwosideKeeper.HelperStructures.Common.GenericFunctions; |
||||
|
||||
public class Party { |
||||
public List<Player> partyplayers; |
||||
public List<Player> lastorder; |
||||
int color; |
||||
Location region; |
||||
|
||||
Party(int color, Location rawPos) { |
||||
partyplayers = new ArrayList<Player>(); |
||||
lastorder = new ArrayList<Player>(); |
||||
rawPos.setX((int)(rawPos.getX()/(16*TwosideKeeper.PARTY_CHUNK_SIZE))*(16*TwosideKeeper.PARTY_CHUNK_SIZE)); |
||||
rawPos.setZ((int)(rawPos.getZ()/(16*TwosideKeeper.PARTY_CHUNK_SIZE))*(16*TwosideKeeper.PARTY_CHUNK_SIZE)); |
||||
region=rawPos; |
||||
TwosideKeeper.log("Party Region Position: "+region.toString(),5); |
||||
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "scoreboard objectives remove Party"+color); //Make sure the party is cleared out if it was used for something before...
|
||||
//Bukkit.getScoreboardManager().getMainScoreboard().registerNewObjective("Party"+color, "dummy");
|
||||
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "scoreboard objectives add Party"+color+" dummy Party"); |
||||
//Bukkit.getScoreboardManager().getMainScoreboard().getObjective("Party"+color).setDisplaySlot(DisplaySlot.SIDEBAR);
|
||||
String color_txt = ""; |
||||
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "scoreboard objectives setdisplay sidebar.team."+ConvertColor(color)+" Party"+color); |
||||
this.color=color; |
||||
} |
||||
|
||||
String ConvertColor(int val) { |
||||
|
||||
switch (val%16) { |
||||
case 0:{ |
||||
return "white"; |
||||
} |
||||
case 1:{ |
||||
return "yellow"; |
||||
} |
||||
case 2:{ |
||||
return "light_purple"; |
||||
} |
||||
case 3:{ |
||||
return "red"; |
||||
} |
||||
case 4:{ |
||||
return "aqua"; |
||||
} |
||||
case 5:{ |
||||
return "green"; |
||||
} |
||||
case 6:{ |
||||
return "blue"; |
||||
} |
||||
case 7:{ |
||||
return "dark_gray"; |
||||
} |
||||
case 8:{ |
||||
return "gray"; |
||||
} |
||||
case 9:{ |
||||
return "gold"; |
||||
} |
||||
case 10:{ |
||||
return "dark_purple"; |
||||
} |
||||
case 11:{ |
||||
return "dark_red"; |
||||
} |
||||
case 12:{ |
||||
return "dark_aqua"; |
||||
} |
||||
case 13:{ |
||||
return "dark_green"; |
||||
} |
||||
case 14:{ |
||||
return "dark_blue"; |
||||
} |
||||
case 15:{ |
||||
return "black"; |
||||
} |
||||
default:{ |
||||
return "white"; |
||||
} |
||||
} |
||||
} |
||||
|
||||
public void addPlayer(Player p) { |
||||
partyplayers.add(p); |
||||
for (int l=0;l<partyplayers.size();l++) { |
||||
PlayerStructure pd = (PlayerStructure)TwosideKeeper.playerdata.get(partyplayers.get(l).getUniqueId()); |
||||
pd.currentparty=TeamNumber(); |
||||
pd.partybonus=partyplayers.size()-1; |
||||
//TwosideKeeper.playerdata.get(k).partybonus=10; //JUST FOR TESTING PURPOSES.
|
||||
if (partyplayers.size()>=2) { |
||||
//partyplayers.get(l).sendMessage(ChatColor.ITALIC+""+ChatColor.GOLD+"Party Bonuses Applied: "+ChatColor.BLUE+"+"+(partyplayers.size()-1)+"0% damage + defense for "+partyplayers.size()+" party members. Drop Rate +"+(partyplayers.size()-1)+"0%");
|
||||
} |
||||
} |
||||
Bukkit.dispatchCommand(Bukkit.getServer().getConsoleSender(), "scoreboard players set "+p.getName().toLowerCase()+" Party"+color+" "+partyplayers.size()*-1); |
||||
Bukkit.dispatchCommand(Bukkit.getServer().getConsoleSender(), "scoreboard teams option "+p.getName().toLowerCase()+" color "+ConvertColor(color)); |
||||
p.getScoreboard().getTeam(p.getName().toLowerCase()).setAllowFriendlyFire(false); |
||||
p.getScoreboard().getTeam(p.getName().toLowerCase()).setSuffix(TwosideKeeper.createHealthbar(((p.getHealth())/p.getMaxHealth())*100,p)); |
||||
TwosideKeeper.setPlayerMaxHealth(p); |
||||
p.getScoreboard().getTeam(p.getName().toLowerCase()).setPrefix(GenericFunctions.PlayerModePrefix(p)); |
||||
} |
||||
|
||||
public void sortPlayers() { |
||||
//Sorts the players on the scoreboard by proper health values.
|
||||
List<Player> sortedorder = new ArrayList<Player>(); |
||||
int lasti=-1; //The last player that had less health than you did.
|
||||
for (int i=0;i<partyplayers.size();i++) { |
||||
for (int j=0;j<sortedorder.size();j++) { |
||||
if (sortedorder.get(j).getHealth()>partyplayers.get(i).getHealth()) { |
||||
lasti=-1; |
||||
} else { |
||||
lasti=j; //This means our health is bigger. We go here.
|
||||
break; |
||||
} |
||||
} |
||||
if (lasti==-1) { |
||||
//This just gets inserted.
|
||||
sortedorder.add(partyplayers.get(i)); |
||||
} else { |
||||
sortedorder.add(lasti,partyplayers.get(i)); |
||||
} |
||||
} |
||||
if (!lastorder.equals(sortedorder)) { |
||||
for (int i=0;i<sortedorder.size();i++) { |
||||
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "scoreboard players set "+sortedorder.get(i).getName().toLowerCase()+" Party"+color+" "+(i+1)*-1); |
||||
} |
||||
lastorder.clear(); |
||||
lastorder.addAll(sortedorder); |
||||
} |
||||
} |
||||
|
||||
public Location getRegion() { |
||||
return region; |
||||
} |
||||
public boolean IsInParty(Player p) { |
||||
if (partyplayers.contains(p)) { |
||||
return true; |
||||
} else { |
||||
return false; |
||||
} |
||||
} |
||||
public boolean IsInSameRegion(Player p) { |
||||
if (((int)(p.getLocation().getX()/(16*TwosideKeeper.PARTY_CHUNK_SIZE))*(16*TwosideKeeper.PARTY_CHUNK_SIZE)) == (int)region.getX() && |
||||
((int)(p.getLocation().getZ()/(16*TwosideKeeper.PARTY_CHUNK_SIZE))*(16*TwosideKeeper.PARTY_CHUNK_SIZE)) == (int)region.getZ() && |
||||
p.getLocation().getWorld() == region.getWorld()) { |
||||
return true; |
||||
} else { |
||||
return false; |
||||
} |
||||
} |
||||
public int PlayerCountInParty() { |
||||
return partyplayers.size(); |
||||
} |
||||
public int TeamNumber() { |
||||
return color; |
||||
} |
||||
public void UpdateRegion(Location newloc) { |
||||
newloc.setX((int)(newloc.getX()/(16*TwosideKeeper.PARTY_CHUNK_SIZE))*(16*TwosideKeeper.PARTY_CHUNK_SIZE)); |
||||
newloc.setZ((int)(newloc.getZ()/(16*TwosideKeeper.PARTY_CHUNK_SIZE))*(16*TwosideKeeper.PARTY_CHUNK_SIZE)); |
||||
region = newloc; |
||||
TwosideKeeper.log("Region Updated: "+region.toString(),5); |
||||
} |
||||
public void RemoveStrayMembers() { |
||||
int prevsiz=partyplayers.size(); |
||||
TwosideKeeper.log("Previous party size was "+prevsiz,5); |
||||
for (int i=0;i<partyplayers.size();i++) { |
||||
if (partyplayers.get(i)==null || |
||||
!partyplayers.get(i).isOnline() || |
||||
partyplayers.get(i).getWorld() != region.getWorld() || |
||||
((int)(partyplayers.get(i).getLocation().getX()/(16*TwosideKeeper.PARTY_CHUNK_SIZE))*(16*TwosideKeeper.PARTY_CHUNK_SIZE)) != (int)region.getX() || |
||||
((int)(partyplayers.get(i).getLocation().getZ()/(16*TwosideKeeper.PARTY_CHUNK_SIZE))*(16*TwosideKeeper.PARTY_CHUNK_SIZE)) != (int)region.getZ()) { |
||||
TwosideKeeper.log(((int)(partyplayers.get(i).getLocation().getX()/(16*TwosideKeeper.PARTY_CHUNK_SIZE))*(16*TwosideKeeper.PARTY_CHUNK_SIZE))+" ;; "+((int)(partyplayers.get(i).getLocation().getZ()/(16*TwosideKeeper.PARTY_CHUNK_SIZE))*(16*TwosideKeeper.PARTY_CHUNK_SIZE))+" - DID NOT MATCH",4); |
||||
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "scoreboard players reset "+partyplayers.get(i).getName().toLowerCase()+" Party"+color); |
||||
for (int l=0;l<partyplayers.size();l++) { |
||||
PlayerStructure pd = (PlayerStructure)TwosideKeeper.playerdata.get(partyplayers.get(l).getUniqueId()); |
||||
if (pd!=null && pd.currentparty == TeamNumber()) { |
||||
if (partyplayers.size()-2<0) { |
||||
pd.partybonus=0; |
||||
} else { |
||||
pd.partybonus=partyplayers.size()-2; |
||||
} |
||||
pd.currentparty=-1; |
||||
} |
||||
} |
||||
if (partyplayers.size()>=2) { |
||||
//partyplayers.get(i).sendMessage(ChatColor.DARK_GRAY+""+ChatColor.ITALIC+"Party buffs removed.");
|
||||
} |
||||
if (partyplayers.get(i)!=null && |
||||
partyplayers.get(i).isOnline()) { |
||||
partyplayers.get(i).getScoreboard().getTeam(partyplayers.get(i).getName().toLowerCase()).setSuffix(TwosideKeeper.createHealthbar(((partyplayers.get(i).getHealth())/partyplayers.get(i).getMaxHealth())*100,partyplayers.get(i))); |
||||
TwosideKeeper.setPlayerMaxHealth(partyplayers.get(i)); |
||||
partyplayers.get(i).getScoreboard().getTeam(partyplayers.get(i).getName().toLowerCase()).setPrefix(GenericFunctions.PlayerModePrefix(partyplayers.get(i))); |
||||
} |
||||
partyplayers.remove(i); |
||||
i--; |
||||
} |
||||
} |
||||
if (prevsiz!=partyplayers.size()) { |
||||
for (int i=0;i<partyplayers.size();i++) { |
||||
if (partyplayers.size()==1) { |
||||
//partyplayers.get(i).sendMessage(ChatColor.DARK_GRAY+""+ChatColor.ITALIC+"Party buffs removed.");
|
||||
} else { |
||||
PlayerStructure pd = (PlayerStructure)TwosideKeeper.playerdata.get(partyplayers.get(i).getUniqueId()); |
||||
pd.partybonus=partyplayers.size()-1; |
||||
//partyplayers.get(i).sendMessage(ChatColor.ITALIC+""+ChatColor.GOLD+"Party Bonuses Applied: "+ChatColor.BLUE+"+"+(partyplayers.size()-1)+"0% damage + defense for "+partyplayers.size()+" party members. Drop Rate +"+(partyplayers.size()-1)+"0%");
|
||||
} |
||||
} |
||||
} |
||||
} |
||||
public static List<Player> getPartyMembers(Player p) { |
||||
//Find the party this player is in.
|
||||
Party part = null; |
||||
for (int i=0;i<TwosideKeeper.PartyList.size();i++) { |
||||
if (TwosideKeeper.PartyList.get(i).IsInParty(p)) { |
||||
return TwosideKeeper.PartyList.get(i).partyplayers; |
||||
} |
||||
} |
||||
return null; |
||||
} |
||||
} |
@ -0,0 +1,220 @@ |
||||
package sig.plugin.TwosideKeeper; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.HashMap; |
||||
import java.util.List; |
||||
|
||||
import org.bukkit.Bukkit; |
||||
import org.bukkit.entity.Player; |
||||
|
||||
import sig.plugin.TwosideKeeper.HelperStructures.Common.GenericFunctions; |
||||
|
||||
public class PartyManager { |
||||
static int totalparties=0; |
||||
static HashMap<Integer, List<Player>> parties = new HashMap<Integer, List<Player>>(); |
||||
static HashMap<Integer, List<Player>> oldparties = new HashMap<Integer, List<Player>>(); |
||||
static HashMap<Integer, List<Player>> sortedorder = new HashMap<Integer, List<Player>>(); |
||||
public static void SetupParties() { |
||||
//Place players into numbered parties.
|
||||
totalparties=0; |
||||
ClearAllParties(); |
||||
for (Player p : Bukkit.getOnlinePlayers()) { |
||||
if (!IsInParty(p)) { |
||||
//We only care about adding a player that's not in a party already.
|
||||
//We have to make a new party for this player.
|
||||
AddPlayerToParty(p,totalparties++); |
||||
//Now find nearby players and add them to this party.
|
||||
AddNearbyPlayersToSameParty(p); |
||||
} |
||||
} |
||||
UpdatePartyScoreboards(); |
||||
} |
||||
|
||||
private static void UpdatePartyScoreboards() { |
||||
for (int i : parties.keySet()) { |
||||
if (oldparties.containsKey(i)) { |
||||
if (PartiesAreDifferent(parties.get(i),oldparties.get(i))) { |
||||
UpdateScoreboard(i,parties.get(i),oldparties.get(i)); |
||||
} else { |
||||
TwosideKeeper.log("Parties are the same!", 5); |
||||
} |
||||
} else { |
||||
UpdateScoreboard(i,parties.get(i),oldparties.get(i)); |
||||
} |
||||
sortPlayers(i, parties.get(i), sortedorder); |
||||
} |
||||
} |
||||
|
||||
private static void UpdateScoreboard(int party, List<Player> partymembers, List<Player> oldmembers) { |
||||
String color = ConvertColor(party); |
||||
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "scoreboard objectives remove Party"+color); //Make sure the party is cleared out if it was used for something before...
|
||||
//Bukkit.getScoreboardManager().getMainScoreboard().registerNewObjective("Party"+color, "dummy");
|
||||
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "scoreboard objectives add Party"+color+" dummy Party"); |
||||
//Bukkit.getScoreboardManager().getMainScoreboard().getObjective("Party"+color).setDisplaySlot(DisplaySlot.SIDEBAR);
|
||||
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "scoreboard objectives setdisplay sidebar.team."+color+" Party"+color); |
||||
|
||||
for (int i=0;i<partymembers.size();i++) { |
||||
Player p = partymembers.get(i); |
||||
PlayerStructure pd = PlayerStructure.GetPlayerStructure(p); |
||||
pd.partybonus = (partymembers.size()>=2)?partymembers.size()-1:0; |
||||
TwosideKeeper.log("Party bonus is "+pd.partybonus, 2); |
||||
TwosideKeeper.log("Adding Player "+p.getName()+" to Scoreboard..", 5); |
||||
Bukkit.dispatchCommand(Bukkit.getServer().getConsoleSender(), "scoreboard players set "+p.getName().toLowerCase()+" Party"+color+" "+((i+1)*-1)); |
||||
Bukkit.dispatchCommand(Bukkit.getServer().getConsoleSender(), "scoreboard teams option "+p.getName().toLowerCase()+" color "+color); |
||||
p.getScoreboard().getTeam(p.getName().toLowerCase()).setAllowFriendlyFire(false); |
||||
p.getScoreboard().getTeam(p.getName().toLowerCase()).setSuffix(TwosideKeeper.createHealthbar(((p.getHealth())/p.getMaxHealth())*100,p)); |
||||
TwosideKeeper.setPlayerMaxHealth(p); |
||||
p.getScoreboard().getTeam(p.getName().toLowerCase()).setPrefix(GenericFunctions.PlayerModePrefix(p)); |
||||
} |
||||
} |
||||
|
||||
public static void sortPlayers(int party, List<Player> partyplayers, HashMap<Integer,List<Player>> lastorder) { |
||||
String color = ConvertColor(party); |
||||
//Sorts the players on the scoreboard by proper health values.
|
||||
List<Player> sortedorder = new ArrayList<Player>(); |
||||
int lasti=-1; //The last player that had less health than you did.
|
||||
for (int i=0;i<partyplayers.size();i++) { |
||||
for (int j=0;j<sortedorder.size();j++) { |
||||
if (sortedorder.get(j).getHealth()>partyplayers.get(i).getHealth()) { |
||||
lasti=-1; |
||||
} else { |
||||
lasti=j; //This means our health is bigger. We go here.
|
||||
break; |
||||
} |
||||
} |
||||
if (lasti==-1) { |
||||
//This just gets inserted.
|
||||
sortedorder.add(partyplayers.get(i)); |
||||
} else { |
||||
sortedorder.add(lasti,partyplayers.get(i)); |
||||
} |
||||
} |
||||
TwosideKeeper.log("Sorted Order: "+sortedorder.toString(), 5); |
||||
if (lastorder.get(party)==null) { |
||||
lastorder.put(party,new ArrayList<Player>()); |
||||
} |
||||
if (!lastorder.get(party).equals(sortedorder)) { |
||||
for (int i=0;i<sortedorder.size();i++) { |
||||
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "scoreboard players set "+sortedorder.get(i).getName().toLowerCase()+" Party"+color+" "+((i+1)*-1)); |
||||
} |
||||
lastorder.put(party,sortedorder); |
||||
} |
||||
} |
||||
|
||||
private static String ConvertColor(int i) { |
||||
switch (i%16) { |
||||
case 0:{ |
||||
return "white"; |
||||
} |
||||
case 1:{ |
||||
return "yellow"; |
||||
} |
||||
case 2:{ |
||||
return "light_purple"; |
||||
} |
||||
case 3:{ |
||||
return "red"; |
||||
} |
||||
case 4:{ |
||||
return "aqua"; |
||||
} |
||||
case 5:{ |
||||
return "green"; |
||||
} |
||||
case 6:{ |
||||
return "blue"; |
||||
} |
||||
case 7:{ |
||||
return "dark_gray"; |
||||
} |
||||
case 8:{ |
||||
return "gray"; |
||||
} |
||||
case 9:{ |
||||
return "gold"; |
||||
} |
||||
case 10:{ |
||||
return "dark_purple"; |
||||
} |
||||
case 11:{ |
||||
return "dark_red"; |
||||
} |
||||
case 12:{ |
||||
return "dark_aqua"; |
||||
} |
||||
case 13:{ |
||||
return "dark_green"; |
||||
} |
||||
case 14:{ |
||||
return "dark_blue"; |
||||
} |
||||
case 15:{ |
||||
return "black"; |
||||
} |
||||
default:{ |
||||
return "white"; |
||||
} |
||||
} |
||||
} |
||||
|
||||
private static boolean PartiesAreDifferent(List<Player> newparty, List<Player> oldparty) { |
||||
if (newparty.size()==oldparty.size()) { |
||||
return !newparty.containsAll(oldparty); |
||||
} else { |
||||
return true; |
||||
} |
||||
} |
||||
|
||||
private static void ClearAllParties() { |
||||
for (Player p : Bukkit.getOnlinePlayers()) { |
||||
PlayerStructure pd = PlayerStructure.GetPlayerStructure(p); |
||||
pd.previousparty=pd.currentparty; |
||||
pd.currentparty=-1; |
||||
} |
||||
oldparties.clear(); |
||||
oldparties.putAll(parties); |
||||
parties.clear(); |
||||
} |
||||
|
||||
private static void AddNearbyPlayersToSameParty(Player sourcep) { |
||||
for (Player checkp : Bukkit.getOnlinePlayers()) { |
||||
if (!IsInParty(checkp) && sourcep.getLocation().distanceSquared(checkp.getLocation())<=Math.pow(TwosideKeeper.PARTY_CHUNK_SIZE,2)) { |
||||
AddPlayerToParty(checkp,GetCurrentParty(sourcep)); |
||||
AddNearbyPlayersToSameParty(checkp); |
||||
} |
||||
} |
||||
} |
||||
|
||||
private static int GetCurrentParty(Player sourcep) { |
||||
return PlayerStructure.GetPlayerStructure(sourcep).currentparty; |
||||
} |
||||
|
||||
private static void AddPlayerToParty(Player p, int i) { |
||||
TwosideKeeper.log("Added player to party "+i, 5); |
||||
PlayerStructure.GetPlayerStructure(p).currentparty=i; |
||||
AddToPartyMap(p,i); |
||||
} |
||||
|
||||
private static void AddToPartyMap(Player p, int i) { |
||||
List<Player> playerlist = parties.get(i); |
||||
if (parties.get(i)==null) { |
||||
playerlist = new ArrayList<Player>(); |
||||
} |
||||
playerlist.add(p); |
||||
parties.put(i, playerlist); |
||||
} |
||||
|
||||
private static boolean IsInParty(Player p) { |
||||
return PlayerStructure.GetPlayerStructure(p).currentparty!=-1; |
||||
} |
||||
|
||||
public static boolean IsInSameParty(Player p, Player p2) { |
||||
return PlayerStructure.GetPlayerStructure(p).currentparty==PlayerStructure.GetPlayerStructure(p2).currentparty; |
||||
} |
||||
|
||||
public static List<Player> getPartyMembers(Player p) { |
||||
List<Player> partymembers = new ArrayList<Player>(); |
||||
int partynumb = GetCurrentParty(p); |
||||
return parties.get(partynumb); |
||||
} |
||||
} |
Loading…
Reference in new issue