parent
8002ad6ec8
commit
0b55d67829
7 changed files with 292 additions and 14 deletions
@ -0,0 +1,160 @@ |
||||
package xyz.soukup.ecoCraftCore.database.objects; |
||||
|
||||
import com.j256.ormlite.dao.ForeignCollection; |
||||
import com.j256.ormlite.field.DatabaseField; |
||||
import com.j256.ormlite.field.ForeignCollectionField; |
||||
import com.j256.ormlite.table.DatabaseTable; |
||||
import xyz.soukup.ecoCraftCore.database.DaoRegistry; |
||||
|
||||
import java.util.HashMap; |
||||
import java.util.List; |
||||
|
||||
@DatabaseTable(tableName = "regions") |
||||
public class Region { |
||||
|
||||
public static final HashMap<String, List<Region>> cache = new HashMap<>(); |
||||
|
||||
@DatabaseField(generatedId = true) |
||||
private int id; |
||||
|
||||
@DatabaseField(canBeNull = false) |
||||
private String island; |
||||
|
||||
@DatabaseField(columnName = "region_type", canBeNull = false) |
||||
private int regionType; |
||||
|
||||
@DatabaseField(canBeNull = false) |
||||
private int x1; |
||||
|
||||
@DatabaseField(canBeNull = false) |
||||
private int y1; |
||||
|
||||
@DatabaseField(canBeNull = false) |
||||
private int x2; |
||||
|
||||
@DatabaseField(canBeNull = false) |
||||
private int y2; |
||||
|
||||
@ForeignCollectionField(eager = true) |
||||
private ForeignCollection<RegionMember> regionMembers; |
||||
|
||||
@DatabaseField() |
||||
private Integer value; |
||||
|
||||
public Region() { |
||||
|
||||
} |
||||
|
||||
public Region(String island, int regionType, int x1, int y1, int x2, int y2) { |
||||
this.island = island; |
||||
this.regionType = regionType; |
||||
this.x1 = Math.min(x1, x2); |
||||
this.y1 = Math.min(y1, y2); |
||||
this.x2 = Math.max(x1, x2) ; |
||||
this.y2 = Math.max(y1, y2); |
||||
|
||||
} |
||||
|
||||
public int getRegionType() { |
||||
return regionType; |
||||
} |
||||
|
||||
public int getX1() { |
||||
return x1; |
||||
} |
||||
|
||||
public int getY1() { |
||||
return y1; |
||||
} |
||||
|
||||
public int getX2() { |
||||
return x2; |
||||
} |
||||
|
||||
public int getY2() { |
||||
return y2; |
||||
} |
||||
|
||||
public ForeignCollection<RegionMember> getRegionMembers() { |
||||
return regionMembers; |
||||
} |
||||
|
||||
public Integer getValue() { |
||||
return value; |
||||
} |
||||
|
||||
public String getIsland() { |
||||
return island; |
||||
} |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public void setRegionType(int regionType) { |
||||
this.regionType = regionType; |
||||
} |
||||
|
||||
public void setValue(Integer value) { |
||||
this.value = value; |
||||
} |
||||
|
||||
public void save(){ |
||||
try { |
||||
DaoRegistry.getRegionDao().createOrUpdate(this); |
||||
} catch (Exception e) { |
||||
e.printStackTrace(); |
||||
} |
||||
} |
||||
|
||||
public boolean isInside(int x, int y) { |
||||
return x >= this.x1 && x <= this.x2 && y >= this.y1 && y <= this.y2; |
||||
} |
||||
|
||||
public static Region findById(int id) { |
||||
try { |
||||
return DaoRegistry.getRegionDao().queryForId(id); |
||||
} catch (Exception e) { |
||||
return null; |
||||
} |
||||
} |
||||
|
||||
public static void cacheRegions(String island) { |
||||
try { |
||||
List<Region> regions = DaoRegistry.getRegionDao().queryBuilder() |
||||
.where() |
||||
.eq("island", island) |
||||
.query(); |
||||
cache.put(island, regions); |
||||
} catch (Exception e) { |
||||
|
||||
} |
||||
} |
||||
|
||||
public static Region findRegion(int x, int y, String island) { |
||||
|
||||
Region region = null; |
||||
Integer highestType = -1; |
||||
|
||||
if (!cache.containsKey(island)) { |
||||
cacheRegions(island); |
||||
} |
||||
|
||||
for (Region cachedRegion : cache.get(island)) { |
||||
if (!cachedRegion.isInside(x, y)) { |
||||
continue; |
||||
} |
||||
if (highestType >= cachedRegion.getRegionType()){ |
||||
continue; |
||||
} |
||||
region = cachedRegion; |
||||
} |
||||
|
||||
return region; |
||||
|
||||
|
||||
} |
||||
|
||||
|
||||
} |
||||
|
||||
@ -0,0 +1,65 @@ |
||||
package xyz.soukup.ecoCraftCore.database.objects; |
||||
|
||||
import com.j256.ormlite.field.DatabaseField; |
||||
import com.j256.ormlite.table.DatabaseTable; |
||||
import xyz.soukup.ecoCraftCore.database.DaoRegistry; |
||||
|
||||
import java.sql.SQLException; |
||||
|
||||
@DatabaseTable(tableName = "region_members") |
||||
public class RegionMember { |
||||
|
||||
@DatabaseField(generatedId = true) |
||||
private int id; |
||||
|
||||
@DatabaseField(foreign = true, foreignAutoRefresh = true, index = true) |
||||
private Region region; |
||||
|
||||
@DatabaseField(columnName = "member_type", canBeNull = false) |
||||
private String membertype; |
||||
|
||||
@DatabaseField(columnName = "member_name", canBeNull = false) |
||||
private String memberName; |
||||
|
||||
@DatabaseField(columnName = "membership_type", canBeNull = false) |
||||
private String membershipType; |
||||
|
||||
public RegionMember(){ |
||||
|
||||
} |
||||
|
||||
public RegionMember(Region region, String membertype, String memberName, String membershipType){ |
||||
this.region = region; |
||||
this.membertype = membertype; |
||||
this.memberName = memberName; |
||||
this.membershipType = membershipType; |
||||
} |
||||
|
||||
public Region getRegion() { |
||||
return region; |
||||
} |
||||
|
||||
public String getMembertype() { |
||||
return membertype; |
||||
} |
||||
|
||||
public String getName() { |
||||
return memberName; |
||||
} |
||||
|
||||
public String getMembershipType() { |
||||
return membershipType; |
||||
} |
||||
|
||||
public void setMembershipType(String membershipType) { |
||||
this.membershipType = membershipType; |
||||
} |
||||
|
||||
public void save(){ |
||||
try { |
||||
DaoRegistry.getRegionMemberDao().createOrUpdate(this); |
||||
} catch (SQLException e) { |
||||
throw new RuntimeException(e); |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,5 @@ |
||||
package xyz.soukup.ecoCraftCore.regions; |
||||
|
||||
public class RegionAdminCommand { |
||||
|
||||
} |
||||
@ -0,0 +1,36 @@ |
||||
package xyz.soukup.ecoCraftCore.regions; |
||||
|
||||
import org.bukkit.entity.Player; |
||||
import org.bukkit.event.EventHandler; |
||||
import org.bukkit.event.Listener; |
||||
import org.bukkit.event.player.PlayerInteractEvent; |
||||
import org.bukkit.event.player.PlayerJoinEvent; |
||||
import xyz.soukup.ecoCraftCore.database.objects.Region; |
||||
import xyz.soukup.ecoCraftCore.database.objects.RegionMember; |
||||
|
||||
public class RegionEvents implements Listener { |
||||
|
||||
@EventHandler |
||||
public void onPlayerInteract(PlayerInteractEvent event){ |
||||
event.setCancelled(!isRegionMember(event.getClickedBlock().getWorld().getName(), event.getPlayer(), event.getClickedBlock().getX(), event.getClickedBlock().getY())); |
||||
} |
||||
|
||||
|
||||
private boolean isRegionMember(String island, Player player, int x, int y){ |
||||
Region region = Region.findRegion(x, y, island); |
||||
|
||||
if (region == null){ |
||||
return false; |
||||
} |
||||
|
||||
String name = player.getName(); |
||||
|
||||
for (RegionMember regionMember : region.getRegionMembers()){ |
||||
if (regionMember.getMembertype().equals("player") && regionMember.getName().equals(name)){ |
||||
return true; |
||||
} |
||||
} |
||||
|
||||
return false; |
||||
} |
||||
} |
||||
Loading…
Reference in new issue