Versions/source/java-1-0-0

Source code of WGPFix 1.0.0 (excluding plugin.yml):

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
package asofold.fix.wgp;

import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;

import org.bukkit.Location;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.event.Event;
import org.bukkit.event.Event.Priority;
import org.bukkit.event.block.BlockListener;
import org.bukkit.event.block.BlockPistonExtendEvent;
import org.bukkit.event.block.BlockPistonRetractEvent;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;

import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.domains.DefaultDomain;
import com.sk89q.worldguard.protection.ApplicableRegionSet;
import com.sk89q.worldguard.protection.managers.RegionManager;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;

public class WGPFix extends JavaPlugin {
    class WGPFixBlockListener extends BlockListener {
        private WGPFix plugin;
        long tsWG = 0;
        long tsThreshold = 4000;
        WorldGuardPlugin wg = null;
        
        public boolean monitorPistons = true;
        
        public  WGPFixBlockListener(WGPFix plg) {
            this.plugin = plg;
            
        }

        @Override
        public void onBlockPistonExtend(BlockPistonExtendEvent event) {
            if ( !monitorPistons) return;
            if ( event.isCancelled()) return;
            Block pistonBlock = event.getBlock();
            List<Block> affectedBlocks = event.getBlocks();

            List<Location> locs = new LinkedList<Location>();
            BlockFace dir = event.getDirection();
            locs.add(pistonBlock.getRelative(dir).getLocation());
            int bSize = affectedBlocks.size();
            if ( (affectedBlocks!=null) && (bSize>0) ){
                for ( Block block : affectedBlocks){
                    locs.add(block.getLocation());
                }
                // add empty block at end
                Block endBlock = pistonBlock.getRelative(dir,bSize+1 );
                locs.add(endBlock.getLocation());
            }
            if ( !sameOwners(pistonBlock.getLocation(), locs)){
                event.setCancelled(true);
            }    
        }

        @Override
        public void onBlockPistonRetract(BlockPistonRetractEvent event) {
            if ( !monitorPistons) return;
            if ( event.isCancelled()) return;
            if (event.isSticky()){
                Block pistonBlock = event.getBlock();
                Location affecteLoc = event.getRetractLocation();
                List<Location> affected = new LinkedList<Location>();
                affected.add(affecteLoc);
                affected.add(pistonBlock.getRelative(event.getDirection()).getLocation());
                if ( !sameOwners(pistonBlock.getLocation(), affected)) event.setCancelled(true);    
            }
            
        }
        
        private void setWG() {
            Plugin temp = plugin.getServer().getPluginManager().getPlugin("WorldGuard");
            WorldGuardPlugin wg = (WorldGuardPlugin) temp;
            this.wg = wg;
            this.tsWG = System.currentTimeMillis();
            // TODO: maybe get region managers already here
        }
        
        public boolean sameOwners(Location refLoc, List<Location> locs){
            if (System.currentTimeMillis()-this.tsWG > this.tsThreshold) this.setWG();
            RegionManager mg = this.wg.getRegionManager(refLoc.getWorld());
            ApplicableRegionSet set = mg.getApplicableRegions(refLoc);
            boolean isRegion = set.size() != 0;
            // TODO: use some caching ?
            Set<String> mustMatch = getUserSet(set);
            int size = mustMatch.size();
            for ( Location loc : locs){
                set = mg.getApplicableRegions(loc);
                int sz = set.size();
                if ( (set==null) || (sz==0)){
                    // ok.
                } else if ( isRegion ){
                    // compare owner sets:
                    Set<String> ref = getUserSet(set);
                    if ( size != ref.size() ) return false;
                    if ( !mustMatch.containsAll(ref)) return false;
                } else {
                    // disallow from no region to unowned region !
                    return false; 
                }
            }
            
            return true;
        }
        public Set<String> getUserSet(ApplicableRegionSet rs){
            Set<String> set = new HashSet<String>();
            if ( rs != null ){
                for ( ProtectedRegion region : rs){
                    DefaultDomain dom = region.getOwners();
                    for ( String p : dom.getPlayers()){
                        set.add(p.toLowerCase());
                    }
                    for ( String p : dom.getGroups()){
                        set.add("g:"+p.toLowerCase());
                    }
                    dom = region.getMembers();
                    for ( String p : dom.getPlayers()){
                        set.add(p.toLowerCase());
                    }
                    for ( String p : dom.getGroups()){
                        set.add("g:"+p.toLowerCase());
                    }
                }
            }
            
            return set;
        }
    }
    
    private final WGPFixBlockListener blockListener = new WGPFixBlockListener(this);
    
    
    @Override
    public void onDisable() {
        System.out.println("WorldGuardPistonFix (WGPFix) 1.0.0 disabled.");
    }

    @Override
    public void onEnable() {
        PluginManager pm = getServer().getPluginManager();
        pm.registerEvent(Event.Type.BLOCK_PISTON_EXTEND, this.blockListener, Priority.Low, this);
        pm.registerEvent(Event.Type.BLOCK_PISTON_RETRACT, this.blockListener, Priority.Low, this);
        System.out.println("WorldGuardPistonFix (WGPFix) 1.0.0 enabled.");
    }

}

Comments

Posts Quoted:
Reply
Clear All Quotes