Factions/src/com/massivecraft/factions/Factions.java

359 lines
11 KiB
Java
Raw Normal View History

package com.massivecraft.factions;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.logging.Level;
import java.util.Set;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.Location;
import org.bukkit.Material;
import com.massivecraft.factions.adapters.FFlagTypeAdapter;
import com.massivecraft.factions.adapters.FPermTypeAdapter;
import com.massivecraft.factions.adapters.LocationTypeAdapter;
import com.massivecraft.factions.adapters.RelTypeAdapter;
2011-10-09 21:57:43 +02:00
import com.massivecraft.factions.cmd.*;
import com.massivecraft.factions.integration.herochat.HerochatFeatures;
import com.massivecraft.factions.integration.Econ;
import com.massivecraft.factions.integration.EssentialsFeatures;
import com.massivecraft.factions.integration.LWCFeatures;
import com.massivecraft.factions.integration.SpoutFeatures;
import com.massivecraft.factions.integration.Worldguard;
import com.massivecraft.factions.listeners.FactionsBlockListener;
import com.massivecraft.factions.listeners.FactionsChatListener;
import com.massivecraft.factions.listeners.FactionsEntityListener;
import com.massivecraft.factions.listeners.FactionsExploitListener;
import com.massivecraft.factions.listeners.FactionsAppearanceListener;
import com.massivecraft.factions.listeners.FactionsPlayerListener;
2011-10-12 17:25:01 +02:00
import com.massivecraft.factions.listeners.FactionsServerListener;
import com.massivecraft.factions.struct.FFlag;
import com.massivecraft.factions.struct.FPerm;
2011-10-23 17:55:53 +02:00
import com.massivecraft.factions.struct.Rel;
New "access" system to replace old ownership system. Access can be granted to build, destroy, and fully interact within any chunk for specific players or factions. Access can also optionally be denied to normal members of the host faction. Some further info display to go with this feature is yet to come, and further testing for possible bugs is also needed. Related info: New FPerm "ACCESS" which is granted to faction leaders and officers by default. This FPerm allows you to bypass access restrictions throughout your faction territory, and (along with the "factions.access" Bukkit permission below) allows you to change access settings for any chunk owned by your faction. New permissions: factions.access - Ability to grant territory access for your faction, if you have the proper "ACCESS" FPerm (defaults to leaders and officers only). Added to factions.kit.halfplayer permission kit. factions.access.any - Ability to grant territory access for any faction on the server. Added to factions.kit.mod permission kit. factions.access.view - Ability to view territory access info for your own faction. Added to factions.kit.halfplayer permission kit. New command: /f access [view|p|f|player|faction=view] [name=you] - view or change the access information for the chunk you are in. If "view" or nothing is specified, it will simply display the info. If "p" or "player" is specified, a player will be granted access, or removed from the list if they were already granted access. If "f" or "faction" is specified, the same will be done for the specified faction. The name defaults to yourself or your faction if not specified. If your own faction is specified, you will toggle restricted access for the chunk so that normal faction members can be denied access, unless they are in the access list. Examples: /f access - view access list, if in your own territory /f access p SomePlayer - grant access to player "SomePlayer" for the current chunk, or remove them from the access list if already there /f access f - toggle restricted access for the current chunk (since faction name isn't specified, uses your own faction), assuming you're in your own factions territory
2012-05-15 04:41:13 +02:00
import com.massivecraft.factions.struct.TerritoryAccess;
import com.massivecraft.factions.util.AutoLeaveTask;
import com.massivecraft.factions.util.EconLandRewardTask;
import com.massivecraft.factions.util.LazyLocation;
import com.massivecraft.factions.zcore.MPlugin;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.craftbukkit.libs.com.google.gson.GsonBuilder;
2013-04-09 13:00:09 +02:00
public class Factions extends MPlugin
{
// -------------------------------------------- //
// INSTANCE & CONSTRUCT
// -------------------------------------------- //
private static Factions i;
public static Factions get() { return i; }
public Factions() { Factions.i = this; }
// -------------------------------------------- //
// FIELDS
// -------------------------------------------- //
// Listeners
public FactionsPlayerListener playerListener;
public FactionsChatListener chatListener;
public FactionsEntityListener entityListener;
public FactionsExploitListener exploitListener;
public FactionsBlockListener blockListener;
public FactionsServerListener serverListener;
public FactionsAppearanceListener appearanceListener;
2011-10-09 21:57:43 +02:00
// Persistance related
2011-10-10 01:21:05 +02:00
private boolean locked = false;
2011-10-09 21:57:43 +02:00
public boolean getLocked() {return this.locked;}
public void setLocked(boolean val) {this.locked = val; this.setAutoSave(val);}
private Integer AutoLeaveTask = null;
private Integer econLandRewardTaskID = null;
2011-10-09 21:57:43 +02:00
// Commands
2011-10-09 20:10:19 +02:00
public FCmdRoot cmdBase;
public CmdAutoHelp cmdAutoHelp;
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public void onEnable()
{
// bit of (apparently absolutely necessary) idiot-proofing for CB version support due to changed GSON lib package name
try
{
Class.forName("org.bukkit.craftbukkit.libs.com.google.gson.reflect.TypeToken");
}
catch (ClassNotFoundException ex)
{
this.log(Level.SEVERE, "GSON lib not found. Your CraftBukkit build is too old (< 1.3.2) or otherwise not compatible.");
this.suicide();
return;
}
if ( ! preEnable()) return;
this.loadSuccessful = false;
// Load Conf from disk
Conf.load();
FPlayers.i.loadFromDisc();
2013-04-09 12:58:39 +02:00
FactionColl.i.loadFromDisc();
Board.load();
// Add Base Commands
this.cmdAutoHelp = new CmdAutoHelp();
this.cmdBase = new FCmdRoot();
EssentialsFeatures.setup();
SpoutFeatures.setup();
Econ.setup();
HerochatFeatures.setup();
LWCFeatures.setup();
if(Conf.worldGuardChecking)
{
Worldguard.init(this);
}
// start up task which runs the autoLeaveAfterDaysOfInactivity routine
startAutoLeaveTask(false);
// start up task which runs the econLandRewardRoutine
startEconLandRewardTask(false);
// Register Event Handlers
this.playerListener = new FactionsPlayerListener(this);
getServer().getPluginManager().registerEvents(this.playerListener, this);
this.chatListener = new FactionsChatListener(this);
getServer().getPluginManager().registerEvents(this.chatListener, this);
this.entityListener = new FactionsEntityListener(this);
getServer().getPluginManager().registerEvents(this.entityListener, this);
this.exploitListener = new FactionsExploitListener();
getServer().getPluginManager().registerEvents(this.exploitListener, this);
this.blockListener = new FactionsBlockListener(this);
getServer().getPluginManager().registerEvents(this.blockListener, this);
this.serverListener = new FactionsServerListener(this);
getServer().getPluginManager().registerEvents(this.serverListener, this);
this.appearanceListener = new FactionsAppearanceListener(this);
getServer().getPluginManager().registerEvents(this.appearanceListener, this);
postEnable();
this.loadSuccessful = true;
}
@Override
public GsonBuilder getGsonBuilder()
{
return new GsonBuilder()
.setPrettyPrinting()
.disableHtmlEscaping()
2011-10-10 14:21:22 +02:00
.excludeFieldsWithModifiers(Modifier.TRANSIENT, Modifier.VOLATILE)
.registerTypeAdapter(LazyLocation.class, new LocationTypeAdapter())
New "access" system to replace old ownership system. Access can be granted to build, destroy, and fully interact within any chunk for specific players or factions. Access can also optionally be denied to normal members of the host faction. Some further info display to go with this feature is yet to come, and further testing for possible bugs is also needed. Related info: New FPerm "ACCESS" which is granted to faction leaders and officers by default. This FPerm allows you to bypass access restrictions throughout your faction territory, and (along with the "factions.access" Bukkit permission below) allows you to change access settings for any chunk owned by your faction. New permissions: factions.access - Ability to grant territory access for your faction, if you have the proper "ACCESS" FPerm (defaults to leaders and officers only). Added to factions.kit.halfplayer permission kit. factions.access.any - Ability to grant territory access for any faction on the server. Added to factions.kit.mod permission kit. factions.access.view - Ability to view territory access info for your own faction. Added to factions.kit.halfplayer permission kit. New command: /f access [view|p|f|player|faction=view] [name=you] - view or change the access information for the chunk you are in. If "view" or nothing is specified, it will simply display the info. If "p" or "player" is specified, a player will be granted access, or removed from the list if they were already granted access. If "f" or "faction" is specified, the same will be done for the specified faction. The name defaults to yourself or your faction if not specified. If your own faction is specified, you will toggle restricted access for the chunk so that normal faction members can be denied access, unless they are in the access list. Examples: /f access - view access list, if in your own territory /f access p SomePlayer - grant access to player "SomePlayer" for the current chunk, or remove them from the access list if already there /f access f - toggle restricted access for the current chunk (since faction name isn't specified, uses your own faction), assuming you're in your own factions territory
2012-05-15 04:41:13 +02:00
.registerTypeAdapter(TerritoryAccess.class, new TerritoryAccess())
.registerTypeAdapter(Rel.class, new RelTypeAdapter())
.registerTypeAdapter(FPerm.class, new FPermTypeAdapter())
.registerTypeAdapter(FFlag.class, new FFlagTypeAdapter());
}
@Override
public void onDisable()
{
// only save data if plugin actually completely loaded successfully
if (this.loadSuccessful)
{
Board.save();
Conf.save();
}
EssentialsFeatures.unhookChat();
if (AutoLeaveTask != null)
{
this.getServer().getScheduler().cancelTask(AutoLeaveTask);
AutoLeaveTask = null;
}
super.onDisable();
}
public void startAutoLeaveTask(boolean restartIfRunning)
{
if (AutoLeaveTask != null)
{
if ( ! restartIfRunning) return;
this.getServer().getScheduler().cancelTask(AutoLeaveTask);
}
if (Conf.autoLeaveRoutineRunsEveryXMinutes > 0.0)
{
long ticks = (long)(20 * 60 * Conf.autoLeaveRoutineRunsEveryXMinutes);
AutoLeaveTask = getServer().getScheduler().scheduleSyncRepeatingTask(this, new AutoLeaveTask(), ticks, ticks);
}
}
public void startEconLandRewardTask(boolean restartIfRunning)
{
if (econLandRewardTaskID != null)
{
if (!restartIfRunning) return;
this.getServer().getScheduler().cancelTask(econLandRewardTaskID);
}
if (Conf.econEnabled &&
Conf.econLandRewardTaskRunsEveryXMinutes > 0.0 &&
Conf.econLandReward > 0.0)
{
long ticks = (long)(20 * 60 * Conf.econLandRewardTaskRunsEveryXMinutes);
econLandRewardTaskID = getServer().getScheduler().scheduleSyncRepeatingTask(this, new EconLandRewardTask(), ticks, ticks);
}
}
2011-10-09 18:35:39 +02:00
@Override
2011-10-09 21:57:43 +02:00
public void postAutoSave()
2011-10-09 18:35:39 +02:00
{
Board.save();
Conf.save();
}
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] split)
{
this.cmdBase.execute(sender, new ArrayList<String>(Arrays.asList(split)));
return true;
}
// -------------------------------------------- //
// Functions for other plugins to hook into
// -------------------------------------------- //
// This value will be updated whenever new hooks are added
public int hookSupportVersion()
{
return 3;
}
// If another plugin is handling insertion of chat tags, this should be used to notify Factions
public void handleFactionTagExternally(boolean notByFactions)
{
Conf.chatTagHandledByAnotherPlugin = notByFactions;
}
// Get a player's faction tag (faction name), mainly for usage by chat plugins for local/channel chat
public String getPlayerFactionTag(Player player)
{
return getPlayerFactionTagRelation(player, null);
}
// Same as above, but with relation (enemy/neutral/ally) coloring potentially added to the tag
public String getPlayerFactionTagRelation(Player speaker, Player listener)
{
String tag = "~";
if (speaker == null)
return tag;
FPlayer me = FPlayers.i.get(speaker);
if (me == null)
return tag;
// if listener isn't set, or config option is disabled, give back uncolored tag
if (listener == null || !Conf.chatParseTagsColored) {
tag = me.getChatTag().trim();
} else {
FPlayer you = FPlayers.i.get(listener);
if (you == null)
tag = me.getChatTag().trim();
else // everything checks out, give the colored tag
tag = me.getChatTag(you).trim();
}
if (tag.isEmpty())
tag = "~";
return tag;
}
// Get a player's title within their faction, mainly for usage by chat plugins for local/channel chat
public String getPlayerTitle(Player player)
{
if (player == null)
return "";
FPlayer me = FPlayers.i.get(player);
if (me == null)
return "";
return me.getTitle().trim();
}
// Get a list of all faction tags (names)
public Set<String> getFactionTags()
{
Set<String> tags = new HashSet<String>();
2013-04-09 12:58:39 +02:00
for (Faction faction : FactionColl.i.get())
{
tags.add(faction.getTag());
}
return tags;
}
// Get a list of all players in the specified faction
public Set<String> getPlayersInFaction(String factionTag)
{
Set<String> players = new HashSet<String>();
2013-04-09 12:58:39 +02:00
Faction faction = FactionColl.i.getByTag(factionTag);
if (faction != null)
{
for (FPlayer fplayer : faction.getFPlayers())
{
players.add(fplayer.getName());
}
}
return players;
}
// Get a list of all online players in the specified faction
public Set<String> getOnlinePlayersInFaction(String factionTag)
{
Set<String> players = new HashSet<String>();
2013-04-09 12:58:39 +02:00
Faction faction = FactionColl.i.getByTag(factionTag);
if (faction != null)
{
for (FPlayer fplayer : faction.getFPlayersWhereOnline(true))
{
players.add(fplayer.getName());
}
}
return players;
}
// check if player is allowed to build/destroy in a particular location
public boolean isPlayerAllowedToBuildHere(Player player, Location location)
{
2011-10-24 01:37:51 +02:00
return FactionsBlockListener.playerCanBuildDestroyBlock(player, location.getBlock(), "", true);
}
// check if player is allowed to interact with the specified block (doors/chests/whatever)
public boolean isPlayerAllowedToInteractWith(Player player, Block block)
{
return FactionsPlayerListener.canPlayerUseBlock(player, block, true);
}
// check if player is allowed to use a specified item (flint&steel, buckets, etc) in a particular location
public boolean isPlayerAllowedToUseThisHere(Player player, Location location, Material material)
{
return FactionsPlayerListener.playerCanUseItemHere(player, location, material, true);
}
}