This commit is contained in:
Daniel Mills 2021-07-31 20:44:52 -04:00
parent ee18217520
commit 9a11021560
8 changed files with 271 additions and 29 deletions

View File

@ -402,4 +402,9 @@ public interface Engine extends DataProvider, Fallible, GeneratorAccess, LootPro
IrisBiome getFocus(); IrisBiome getFocus();
void hotloading(); void hotloading();
default void saveProperties()
{
}
} }

View File

@ -0,0 +1,80 @@
/*
* Iris is a World Generator for Minecraft Bukkit Servers
* Copyright (c) 2021 Arcane Arts (Volmit Software)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.volmit.iris.engine.object;
import com.volmit.iris.engine.object.annotations.Desc;
import com.volmit.iris.util.format.Form;
import lombok.Data;
import org.bukkit.World;
import java.util.concurrent.TimeUnit;
@Data
@Desc("Represents a combined duration. Fill each property to add time into a single duration")
public class IrisDuration {
@Desc("Milliseconds (1000ms = 1 second)")
private int milliseconds = 0;
@Desc("Minecraft Ticks (20 minecraft ticks = 1 second")
private int minecraftTicks = 0;
@Desc("Seconds (60 seconds = 1 minute)")
private int seconds = 0;
@Desc("Minutes (60 minutes = 1 hour)")
private int minutes = 0;
@Desc("Minecraft Hours (about 50 real seconds)")
private int minecraftHours = 0;
@Desc("Hours (24 hours = 1 day)")
private int hours = 0;
@Desc("Minecraft Days (1 minecraft day = 20 real minutes)")
private int minecraftDays = 0;
@Desc("Minecraft Weeks (1 minecraft week = 2 real hours and 18 real minutes)")
private int minecraftWeeks = 0;
@Desc("Minecraft Lunar Cycles (1 minecraft lunar cycle = 2 real hours and 36 real minutes)")
private int minecraftLunarCycles = 0;
@Desc("REAL (not minecraft) Days")
private int days = 0;
public String toString()
{
return Form.duration((double) toMilliseconds(), 2);
}
public long toMilliseconds()
{
return getMilliseconds()
+ TimeUnit.SECONDS.toMillis(getSeconds())
+ TimeUnit.MINUTES.toMillis(getMinutes())
+ TimeUnit.HOURS.toMillis(getHours())
+ TimeUnit.DAYS.toMillis(getDays())
+ (getMinecraftTicks() * 50L)
+ (getMinecraftHours() * 50000L)
+ (getMinecraftWeeks() * 50000L)
+ (getMinecraftDays() * 24000L)
+ (getMinecraftWeeks() * 168000L)
+ (getMinecraftLunarCycles() * 192000L);
}
}

View File

@ -0,0 +1,54 @@
/*
* Iris is a World Generator for Minecraft Bukkit Servers
* Copyright (c) 2021 Arcane Arts (Volmit Software)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.volmit.iris.engine.object;
import com.volmit.iris.engine.object.annotations.Desc;
import com.volmit.iris.util.format.Form;
import com.volmit.iris.util.scheduling.ChronoLatch;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@NoArgsConstructor
@AllArgsConstructor
@Data
@Desc("Represents a count of something per time duration")
public class IrisRate {
@Desc("The amount of things. Leave 0 for infinite (meaning always spawn whenever)")
private int amount = 0;
@Desc("The time interval. Leave blank for infinite 0 (meaning always spawn all the time)")
private IrisDuration per = new IrisDuration();
public String toString()
{
return Form.f(amount) + "/" + per;
}
public long getInterval()
{
long t = per.getMilliseconds() / amount;
return Math.abs(t <= 0 ? 1 : t);
}
public ChronoLatch toChronoLatch()
{
return new ChronoLatch(getInterval());
}
}

View File

@ -34,6 +34,7 @@ import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import org.bukkit.Chunk; import org.bukkit.Chunk;
import org.bukkit.World;
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@Accessors(chain = true) @Accessors(chain = true)
@ -46,23 +47,17 @@ public class IrisSpawner extends IrisRegistrant {
@Desc("The entity spawns to add") @Desc("The entity spawns to add")
private KList<IrisEntitySpawn> spawns = new KList<>(); private KList<IrisEntitySpawn> spawns = new KList<>();
private AtomicCache<KList<IrisEntitySpawn>> selection = new AtomicCache<>(); @Desc("The block of 24 hour time to contain this spawn in.")
private IrisTimeBlock timeBlock = new IrisTimeBlock();
public boolean spawnInChunk(Engine engine, Chunk c) { @Desc("The block of 24 hour time to contain this spawn in.")
if(spawns.isEmpty()) private IrisWeather weather = IrisWeather.ANY;
@Desc("The maximum rate this spawner can fire")
private IrisRate maximumRate = new IrisRate();
public boolean isValid(World world)
{ {
Iris.warn(" Spawner " + getLoadKey() + " has an empty spawn list! (" + getLoadFile().getPath() + ")"); return timeBlock.isWithin(world) && weather.is(world);
return false;
}
return selection.aquire(() -> {
KList<IrisEntitySpawn> rarityTypes = new KList<>();
for (IrisEntitySpawn i : spawns) {
rarityTypes.addMultiple(i, IRare.get(i));
}
return rarityTypes;
}).getRandom(RNG.r).spawn(engine, c, RNG.r);
} }
} }

View File

@ -0,0 +1,58 @@
/*
* Iris is a World Generator for Minecraft Bukkit Servers
* Copyright (c) 2021 Arcane Arts (Volmit Software)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.volmit.iris.engine.object;
import com.volmit.iris.engine.object.annotations.Desc;
import lombok.Data;
import org.bukkit.World;
@Data
@Desc("Represents a time of day (24h time, not 12h am/pm). Set both to the same number for any time. If they are both set to -1, it will always be not allowed.")
public class IrisTimeBlock {
@Desc("The beginning hour. Set both to the same number for any time. If they are both set to -1, it will always be not allowed.")
private double startHour = 0;
@Desc("The ending hour. Set both to the same number for any time. If they are both set to -1, it will always be not allowed.")
private double endHour = 0;
public boolean isWithin(World world)
{
return isWithin(world.getTime() / 1000D);
}
public boolean isWithin(double hour)
{
if(startHour == endHour)
{
if(endHour == -1)
{
return false;
}
return true;
}
if(startHour > endHour)
{
return !(hour >= startHour && hour <= endHour);
}
return hour >= startHour && hour <= endHour;
}
}

View File

@ -20,6 +20,7 @@ package com.volmit.iris.engine.object;
import com.volmit.iris.engine.object.annotations.Desc; import com.volmit.iris.engine.object.annotations.Desc;
import lombok.Data; import lombok.Data;
import org.bukkit.World;
@Desc("Represents a weather type") @Desc("Represents a weather type")
public enum IrisWeather { public enum IrisWeather {
@ -27,5 +28,22 @@ public enum IrisWeather {
NONE, NONE,
@Desc("Represents rain or snow") @Desc("Represents rain or snow")
DOWNFALL DOWNFALL,
@Desc("Represents rain or snow with thunder")
DOWNFALL_WITH_THUNDER,
@Desc("Any weather")
ANY;
public boolean is(World world)
{
return switch(this)
{
case NONE -> world.isClearWeather();
case DOWNFALL -> world.hasStorm() && world.isThundering();
case DOWNFALL_WITH_THUNDER -> world.hasStorm();
case ANY -> true;
};
}
} }

View File

@ -16,22 +16,12 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.volmit.iris.engine.object; package com.volmit.iris.engine.object.engine;
import com.volmit.iris.engine.object.annotations.Desc;
import lombok.Data; import lombok.Data;
@Data @Data
@Desc("Represents a time of day (24h time, not 12h am/pm)") public class IrisEngineData
public class IrisTime {
@Desc("The beginning hour")
private double startHour = 0;
@Desc("The ending hour")
private double endHour = 24;
public boolean isWithin(double hour)
{ {
} }
}

View File

@ -0,0 +1,42 @@
/*
* Iris is a World Generator for Minecraft Bukkit Servers
* Copyright (c) 2021 Arcane Arts (Volmit Software)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.volmit.iris.engine.object.engine;
import com.volmit.iris.engine.framework.Engine;
import com.volmit.iris.engine.object.IrisRate;
import com.volmit.iris.util.math.M;
import lombok.Data;
@Data
public class IrisEngineSpawnerCooldown
{
private long lastSpawn;
private String spawner;
public void spawn(Engine engine)
{
lastSpawn = M.ms();
engine.saveProperties();
}
public boolean canSpawn(IrisRate s)
{
return M.ms() - lastSpawn > s.getInterval();
}
}