Merge branch '1.8-Rewrite' of https://github.com/WayofTime/BloodMagic into 1.8-Rewrite
Conflicts: src/main/java/WayofTime/bloodmagic/registry/ModBlocks.java
This commit is contained in:
commit
4734f1207a
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -33,4 +33,6 @@ crash-reports/
|
|||
Thumbs.db
|
||||
usernamecache.json
|
||||
options.txt
|
||||
BloodMagic_Client.launch
|
||||
BloodMagic_Server.launch
|
||||
|
||||
|
|
|
@ -2,11 +2,8 @@ package WayofTime.bloodmagic;
|
|||
|
||||
import WayofTime.bloodmagic.api.util.helper.LogHelper;
|
||||
import WayofTime.bloodmagic.network.AlchemicalWizardryPacketHandler;
|
||||
import WayofTime.bloodmagic.registry.ModBlocks;
|
||||
import WayofTime.bloodmagic.registry.ModEntities;
|
||||
import WayofTime.bloodmagic.registry.ModItems;
|
||||
import WayofTime.bloodmagic.registry.ModPotions;
|
||||
import WayofTime.bloodmagic.proxy.CommonProxy;
|
||||
import WayofTime.bloodmagic.registry.*;
|
||||
import WayofTime.bloodmagic.util.handler.EventHandler;
|
||||
import WayofTime.bloodmagic.util.helper.InventoryRenderHelper;
|
||||
import lombok.Getter;
|
||||
|
@ -16,6 +13,7 @@ import net.minecraftforge.common.MinecraftForge;
|
|||
import net.minecraftforge.fml.common.FMLCommonHandler;
|
||||
import net.minecraftforge.fml.common.Mod;
|
||||
import net.minecraftforge.fml.common.SidedProxy;
|
||||
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
|
||||
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
|
||||
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
|
||||
|
||||
|
@ -67,9 +65,13 @@ public class BloodMagic {
|
|||
}
|
||||
|
||||
@Mod.EventHandler
|
||||
public void init(FMLPreInitializationEvent event) {
|
||||
public void init(FMLInitializationEvent event) {
|
||||
AlchemicalWizardryPacketHandler.init();
|
||||
|
||||
ModRituals.initRituals();
|
||||
ModRituals.initImperfectRituals();
|
||||
ConfigHandler.checkRituals();
|
||||
|
||||
proxy.init();
|
||||
}
|
||||
|
||||
|
|
|
@ -2,8 +2,12 @@ package WayofTime.bloodmagic;
|
|||
|
||||
import WayofTime.bloodmagic.api.BloodMagicAPI;
|
||||
import WayofTime.bloodmagic.api.BlockStack;
|
||||
import WayofTime.bloodmagic.api.registry.ImperfectRitualRegistry;
|
||||
import WayofTime.bloodmagic.api.util.helper.RitualHelper;
|
||||
import WayofTime.bloodmagic.registry.ModPotions;
|
||||
import WayofTime.bloodmagic.util.Utils;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraftforge.common.config.Configuration;
|
||||
import net.minecraftforge.fml.common.registry.GameRegistry;
|
||||
|
@ -16,7 +20,9 @@ import java.util.List;
|
|||
|
||||
public class ConfigHandler {
|
||||
|
||||
public static Configuration config;
|
||||
@Getter
|
||||
@Setter
|
||||
private static Configuration config;
|
||||
|
||||
// Teleposer
|
||||
public static String[] teleposerBlacklisting;
|
||||
|
@ -159,6 +165,9 @@ public class ConfigHandler {
|
|||
vanillaPotionWaterBreathingEnabled = config.getBoolean("vanillaPotionWaterBreathingEnabled", category + ".toggle", true, "Enables the Water Breathing potion in Alchemy");
|
||||
vanillaPotionWeaknessEnabled = config.getBoolean("vanillaPotionWeaknessEnabled", category + ".toggle", true, "Enables the Weakness potion in Alchemy");
|
||||
|
||||
category = "Rituals";
|
||||
config.addCustomCategoryComment(category, "Ritual toggling");
|
||||
|
||||
category = "General";
|
||||
config.addCustomCategoryComment(category, "General settings");
|
||||
BloodMagicAPI.setLoggingEnabled(config.getBoolean("enableLogging", category, true, "Allows logging information to the console. Fatal errors will bypass this"));
|
||||
|
@ -192,4 +201,9 @@ public class ConfigHandler {
|
|||
teleposerBlacklist.add(new BlockStack(block, meta));
|
||||
}
|
||||
}
|
||||
|
||||
public static void checkRituals() {
|
||||
RitualHelper.checkImperfectRituals(config, "WayofTime.bloodmagic.ritual.imperfect", "Rituals.imperfect");
|
||||
config.save();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,9 +1,11 @@
|
|||
package WayofTime.bloodmagic.api.registry;
|
||||
|
||||
import WayofTime.bloodmagic.api.BlockStack;
|
||||
import WayofTime.bloodmagic.api.BloodMagicAPI;
|
||||
import WayofTime.bloodmagic.api.ritual.imperfect.ImperfectRitual;
|
||||
import com.google.common.collect.BiMap;
|
||||
import com.google.common.collect.HashBiMap;
|
||||
import net.minecraft.block.Block;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
|
@ -27,6 +29,17 @@ public class ImperfectRitualRegistry {
|
|||
}
|
||||
}
|
||||
|
||||
public static ImperfectRitual getRitualForBlock(BlockStack blockStack) {
|
||||
for (ImperfectRitual imperfectRitual : getRegistry().values()) {
|
||||
if (imperfectRitual.getRequiredBlock().equals(blockStack)) {
|
||||
System.out.println(imperfectRitual.toString());
|
||||
return imperfectRitual;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public static ImperfectRitual getRitualForId(String id) {
|
||||
return registry.get(id);
|
||||
}
|
||||
|
@ -44,13 +57,22 @@ public class ImperfectRitualRegistry {
|
|||
}
|
||||
|
||||
public static boolean ritualEnabled(ImperfectRitual imperfectRitual) {
|
||||
return enabledRituals.get(imperfectRitual);
|
||||
try {
|
||||
return enabledRituals.get(imperfectRitual);
|
||||
} catch (NullPointerException e) {
|
||||
BloodMagicAPI.getLogger().error("Invalid Imperfect Ritual was called");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static BiMap<String, ImperfectRitual> getRegistry() {
|
||||
return HashBiMap.create(registry);
|
||||
}
|
||||
|
||||
public static BiMap<ImperfectRitual, Boolean> getEnabledMap() {
|
||||
return HashBiMap.create(enabledRituals);
|
||||
}
|
||||
|
||||
public static ArrayList<String> getIds() {
|
||||
return new ArrayList<String>(registry.keySet());
|
||||
}
|
||||
|
|
|
@ -2,6 +2,7 @@ package WayofTime.bloodmagic.api.registry;
|
|||
|
||||
import WayofTime.bloodmagic.api.BloodMagicAPI;
|
||||
import WayofTime.bloodmagic.api.ritual.Ritual;
|
||||
import WayofTime.bloodmagic.api.ritual.imperfect.ImperfectRitual;
|
||||
import com.google.common.collect.BiMap;
|
||||
import com.google.common.collect.HashBiMap;
|
||||
import java.util.ArrayList;
|
||||
|
@ -43,13 +44,22 @@ public class RitualRegistry {
|
|||
}
|
||||
|
||||
public static boolean ritualEnabled(Ritual ritual) {
|
||||
return enabledRituals.get(ritual);
|
||||
try {
|
||||
return enabledRituals.get(ritual);
|
||||
} catch (NullPointerException e) {
|
||||
BloodMagicAPI.getLogger().error("Invalid Ritual was called");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static BiMap<String, Ritual> getRegistry() {
|
||||
return HashBiMap.create(registry);
|
||||
}
|
||||
|
||||
public static BiMap<Ritual, Boolean> getEnabledMap() {
|
||||
return HashBiMap.create(enabledRituals);
|
||||
}
|
||||
|
||||
public static ArrayList<String> getIds() {
|
||||
return new ArrayList<String>(registry.keySet());
|
||||
}
|
||||
|
|
|
@ -1,15 +1,21 @@
|
|||
package WayofTime.bloodmagic.api.ritual;
|
||||
|
||||
import WayofTime.bloodmagic.api.ritual.imperfect.IImperfectRitualStone;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.BlockPos;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public interface IMasterRitualStone extends IImperfectRitualStone {
|
||||
public interface IMasterRitualStone {
|
||||
|
||||
String getOwner();
|
||||
|
||||
boolean activateRitual(ItemStack activationCrystal, EntityPlayer activator);
|
||||
|
||||
void performRitual(World world, BlockPos pos, Ritual ritual);
|
||||
|
||||
void stopRitual();
|
||||
|
||||
void setCooldown(int cooldown);
|
||||
|
||||
int getCooldown();
|
||||
|
@ -18,15 +24,11 @@ public interface IMasterRitualStone extends IImperfectRitualStone {
|
|||
|
||||
EnumFacing getDirection();
|
||||
|
||||
NBTTagCompound getCustomRitualTag();
|
||||
|
||||
void setCustomRitualTag(NBTTagCompound tag);
|
||||
|
||||
boolean areTanksEmpty();
|
||||
|
||||
int getRunningTime();
|
||||
|
||||
LocalRitualStorage getLocalStorage();
|
||||
World getWorld();
|
||||
|
||||
void setLocalStorage(LocalRitualStorage storage);
|
||||
BlockPos getPos();
|
||||
}
|
||||
|
|
|
@ -1,28 +0,0 @@
|
|||
package WayofTime.bloodmagic.api.ritual;
|
||||
|
||||
import WayofTime.bloodmagic.api.NBTHolder;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.util.BlockPos;
|
||||
|
||||
/**
|
||||
* This class is used to pass ritual-specific data into the RitualEffect from the containing Master Ritual Stone. This is basically used as auxiliary storage,
|
||||
* for when simply storing to NBT becomes... difficult.
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
public class LocalRitualStorage {
|
||||
|
||||
private BlockPos pos;
|
||||
|
||||
public void writeToNBT(NBTTagCompound tagCompound) {
|
||||
tagCompound.setInteger(NBTHolder.NBT_COORDX, pos.getX());
|
||||
tagCompound.setInteger(NBTHolder.NBT_COORDY, pos.getY());
|
||||
tagCompound.setInteger(NBTHolder.NBT_COORDZ, pos.getZ());
|
||||
}
|
||||
|
||||
public void readFromNBT(NBTTagCompound tagCompound) {
|
||||
this.pos = new BlockPos(tagCompound.getInteger(NBTHolder.NBT_COORDX), tagCompound.getInteger(NBTHolder.NBT_COORDY), tagCompound.getInteger(NBTHolder.NBT_COORDZ));
|
||||
}
|
||||
}
|
|
@ -1,5 +1,6 @@
|
|||
package WayofTime.bloodmagic.api.ritual;
|
||||
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.Getter;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
|
@ -9,6 +10,7 @@ import java.util.ArrayList;
|
|||
|
||||
@Getter
|
||||
@RequiredArgsConstructor
|
||||
@EqualsAndHashCode
|
||||
public abstract class Ritual {
|
||||
|
||||
private final String name;
|
||||
|
@ -32,10 +34,6 @@ public abstract class Ritual {
|
|||
|
||||
public abstract ArrayList<RitualComponent> getComponents();
|
||||
|
||||
public LocalRitualStorage getNewLocalStorage() {
|
||||
return new LocalRitualStorage();
|
||||
}
|
||||
|
||||
public void addOffsetRunes(ArrayList<RitualComponent> components, int offset1, int offset2, int y, EnumRuneType rune) {
|
||||
components.add(new RitualComponent(new BlockPos(offset1, y, offset2), rune));
|
||||
components.add(new RitualComponent(new BlockPos(offset2, y, offset1), rune));
|
||||
|
|
|
@ -1,11 +1,12 @@
|
|||
package WayofTime.bloodmagic.api.ritual.imperfect;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.util.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public interface IImperfectRitualStone {
|
||||
|
||||
String getOwner();
|
||||
boolean performRitual(World world, BlockPos pos, ImperfectRitual imperfectRitual, EntityPlayer player);
|
||||
|
||||
World getWorld();
|
||||
|
||||
|
|
|
@ -1,19 +1,29 @@
|
|||
package WayofTime.bloodmagic.api.ritual.imperfect;
|
||||
|
||||
import WayofTime.bloodmagic.api.BlockStack;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.Getter;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
|
||||
@RequiredArgsConstructor
|
||||
@Getter
|
||||
@EqualsAndHashCode
|
||||
public abstract class ImperfectRitual {
|
||||
|
||||
private final String name;
|
||||
private final BlockStack requiredBlock;
|
||||
private final int activationCost;
|
||||
private final boolean lightshow;
|
||||
|
||||
public ImperfectRitual(BlockStack requiredBlock, int activationCost) {
|
||||
this(requiredBlock, activationCost, false);
|
||||
public ImperfectRitual(String name, BlockStack requiredBlock, int activationCost) {
|
||||
this(name, requiredBlock, activationCost, false);
|
||||
}
|
||||
|
||||
public abstract boolean onActivate(IImperfectRitualStone imperfectRitualStone, EntityPlayer player);
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return getName() + ":" + getRequiredBlock().toString() + "@" + getActivationCost();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,10 @@
|
|||
package WayofTime.bloodmagic.api.util.helper;
|
||||
|
||||
import WayofTime.bloodmagic.api.registry.ImperfectRitualRegistry;
|
||||
import WayofTime.bloodmagic.api.registry.RitualRegistry;
|
||||
import WayofTime.bloodmagic.api.ritual.Ritual;
|
||||
import WayofTime.bloodmagic.api.ritual.imperfect.ImperfectRitual;
|
||||
import com.google.common.collect.BiMap;
|
||||
import net.minecraftforge.common.config.Configuration;
|
||||
import sun.misc.Launcher;
|
||||
|
||||
|
@ -28,6 +31,14 @@ public class RitualHelper {
|
|||
return RitualRegistry.getIds().get(previousIndex);
|
||||
}
|
||||
|
||||
public static void checkImperfectRituals(Configuration config, String packageName, String category) {
|
||||
checkRituals(config, packageName, category, ImperfectRitual.class, ImperfectRitualRegistry.enabledRituals);
|
||||
}
|
||||
|
||||
public static void checkRituals(Configuration config, String packageName, String category) {
|
||||
checkRituals(config, packageName, category, Ritual.class, RitualRegistry.enabledRituals);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds your Ritual to the {@link RitualRegistry#enabledRituals} Map.
|
||||
* This is used to determine whether your effect is enabled or not.
|
||||
|
@ -35,13 +46,16 @@ public class RitualHelper {
|
|||
* The config option will be created as {@code B:ClassName=true} with a comment of
|
||||
* {@code Enables the ClassName ritual}.
|
||||
*
|
||||
* Use {@link #}
|
||||
*
|
||||
* Should be safe to modify at any point.
|
||||
*
|
||||
* @param config - Your mod's Forge {@link Configuration} object.
|
||||
* @param packageName - The package your Rituals are located in.
|
||||
* @param category - The config category to write to.
|
||||
*/
|
||||
public static void checkRituals(Configuration config, String packageName, String category) {
|
||||
@SuppressWarnings("unchecked")
|
||||
private static void checkRituals(Configuration config, String packageName, String category, Class ritualClass, BiMap enabledMap) {
|
||||
String name = packageName;
|
||||
if (!name.startsWith("/"))
|
||||
name = "/" + name;
|
||||
|
@ -60,8 +74,9 @@ public class RitualHelper {
|
|||
try {
|
||||
Object o = Class.forName(packageName + "." + className).newInstance();
|
||||
|
||||
if (o instanceof Ritual)
|
||||
RitualRegistry.enabledRituals.put((Ritual) o, config.get(category, className, true).getBoolean());
|
||||
if (ritualClass.isInstance(o))
|
||||
enabledMap.put(ritualClass.cast(o),
|
||||
config.get(category, className, true).getBoolean());
|
||||
|
||||
} catch (ClassNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
|
|
|
@ -15,6 +15,26 @@ public class BlockAltar extends BlockContainer {
|
|||
setCreativeTab(BloodMagic.tabBloodMagic);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isOpaqueCube() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isFullCube() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isVisuallyOpaque() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getRenderType() {
|
||||
return 3;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TileEntity createNewTileEntity(World world, int meta) {
|
||||
// return new TileAltar();
|
||||
|
|
|
@ -1,6 +1,9 @@
|
|||
package WayofTime.bloodmagic.block;
|
||||
|
||||
import WayofTime.bloodmagic.BloodMagic;
|
||||
import WayofTime.bloodmagic.api.BlockStack;
|
||||
import WayofTime.bloodmagic.api.registry.ImperfectRitualRegistry;
|
||||
import WayofTime.bloodmagic.tile.TileImperfectRitualStone;
|
||||
import WayofTime.bloodmagic.tile.TileMasterRitualStone;
|
||||
import net.minecraft.block.BlockContainer;
|
||||
import net.minecraft.block.material.Material;
|
||||
|
@ -13,6 +16,7 @@ import net.minecraft.item.Item;
|
|||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.BlockPos;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
import net.minecraft.util.MovingObjectPosition;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.fml.relauncher.Side;
|
||||
|
@ -43,6 +47,21 @@ public class BlockRitualController extends BlockContainer {
|
|||
list.add(new ItemStack(this, 1, i));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumFacing side, float hitX, float hitY, float hitZ) {
|
||||
TileEntity tile = world.getTileEntity(pos);
|
||||
|
||||
if (getMetaFromState(state) == 1 && tile instanceof TileImperfectRitualStone) {
|
||||
|
||||
IBlockState determinerState = world.getBlockState(pos.up());
|
||||
BlockStack determiner = new BlockStack(determinerState.getBlock(), determinerState.getBlock().getMetaFromState(determinerState));
|
||||
|
||||
return ((TileImperfectRitualStone) tile).performRitual(world, pos, ImperfectRitualRegistry.getRitualForBlock(determiner), player);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getRenderType() {
|
||||
return 3;
|
||||
|
@ -75,6 +94,6 @@ public class BlockRitualController extends BlockContainer {
|
|||
|
||||
@Override
|
||||
public TileEntity createNewTileEntity(World world, int meta) {
|
||||
return meta == 0 ? new TileMasterRitualStone() : null;
|
||||
return meta == 0 ? new TileMasterRitualStone() : new TileImperfectRitualStone();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -21,10 +21,11 @@ public class ConfigGui extends GuiConfig {
|
|||
List<IConfigElement> list = new ArrayList<IConfigElement>();
|
||||
|
||||
// adds sections declared in ConfigHandler. toLowerCase() is used because the configuration class automatically does this, so must we.
|
||||
list.add(new ConfigElement(ConfigHandler.config.getCategory("Potions".toLowerCase())));
|
||||
list.add(new ConfigElement(ConfigHandler.config.getCategory("Teleposer Blacklist".toLowerCase())));
|
||||
list.add(new ConfigElement(ConfigHandler.config.getCategory("Item/Block Blacklisting".toLowerCase())));
|
||||
list.add(new ConfigElement(ConfigHandler.config.getCategory("General".toLowerCase())));
|
||||
list.add(new ConfigElement(ConfigHandler.getConfig().getCategory("Potions".toLowerCase())));
|
||||
list.add(new ConfigElement(ConfigHandler.getConfig().getCategory("Teleposer Blacklist".toLowerCase())));
|
||||
list.add(new ConfigElement(ConfigHandler.getConfig().getCategory("Item/Block Blacklisting".toLowerCase())));
|
||||
list.add(new ConfigElement(ConfigHandler.getConfig().getCategory("General".toLowerCase())));
|
||||
list.add(new ConfigElement(ConfigHandler.getConfig().getCategory("Rituals".toLowerCase())));
|
||||
|
||||
return list;
|
||||
}
|
||||
|
|
|
@ -5,9 +5,9 @@ import net.minecraft.block.Block;
|
|||
import net.minecraft.item.ItemBlock;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
public class ItemBlockRitualHome extends ItemBlock {
|
||||
public class ItemBlockRitualController extends ItemBlock {
|
||||
|
||||
public ItemBlockRitualHome(Block block) {
|
||||
public ItemBlockRitualController(Block block) {
|
||||
super(block);
|
||||
|
||||
setHasSubtypes(true);
|
|
@ -1,7 +1,12 @@
|
|||
package WayofTime.bloodmagic.proxy;
|
||||
|
||||
import WayofTime.bloodmagic.BloodMagic;
|
||||
import WayofTime.bloodmagic.registry.ModBlocks;
|
||||
import WayofTime.bloodmagic.registry.ModItems;
|
||||
import WayofTime.bloodmagic.util.helper.InventoryRenderHelper;
|
||||
import net.minecraft.client.resources.model.ModelResourceLocation;
|
||||
import net.minecraftforge.client.model.ModelLoader;
|
||||
import net.minecraftforge.client.model.obj.OBJLoader;
|
||||
|
||||
public class ClientProxy extends CommonProxy {
|
||||
|
||||
|
@ -9,6 +14,9 @@ public class ClientProxy extends CommonProxy {
|
|||
public void preInit() {
|
||||
ModBlocks.initRenders();
|
||||
ModItems.initRenders();
|
||||
|
||||
OBJLoader.instance.addDomain(BloodMagic.MODID);
|
||||
ModelLoader.setCustomModelResourceLocation(InventoryRenderHelper.getItemFromBlock(ModBlocks.altar), 0, new ModelResourceLocation(BloodMagic.DOMAIN + "BlockAltar", "inventory"));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -7,7 +7,9 @@ import WayofTime.bloodmagic.block.BlockBloodRune;
|
|||
import WayofTime.bloodmagic.block.BlockLifeEssence;
|
||||
import WayofTime.bloodmagic.block.BlockRitualController;
|
||||
import WayofTime.bloodmagic.item.block.ItemBlockBloodRune;
|
||||
import WayofTime.bloodmagic.item.block.ItemBlockRitualHome;
|
||||
import WayofTime.bloodmagic.item.block.ItemBlockRitualController;
|
||||
import WayofTime.bloodmagic.tile.TileImperfectRitualStone;
|
||||
import WayofTime.bloodmagic.tile.TileMasterRitualStone;
|
||||
import WayofTime.bloodmagic.util.helper.InventoryRenderHelper;
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.item.ItemBlock;
|
||||
|
@ -32,14 +34,15 @@ public class ModBlocks
|
|||
|
||||
altar = registerBlock(new BlockAltar());
|
||||
blood_rune = registerBlock(new BlockBloodRune(), ItemBlockBloodRune.class);
|
||||
ritualStone = registerBlock(new BlockRitualController(), ItemBlockRitualHome.class);
|
||||
ritualStone = registerBlock(new BlockRitualController(), ItemBlockRitualController.class);
|
||||
|
||||
initTiles();
|
||||
}
|
||||
|
||||
public static void initTiles()
|
||||
{
|
||||
|
||||
GameRegistry.registerTileEntity(TileImperfectRitualStone.class, BloodMagic.MODID + ":" + TileImperfectRitualStone.class.getSimpleName());
|
||||
GameRegistry.registerTileEntity(TileMasterRitualStone.class, BloodMagic.MODID + ":" + TileMasterRitualStone.class.getSimpleName());
|
||||
}
|
||||
|
||||
public static void initRenders()
|
||||
|
|
19
src/main/java/WayofTime/bloodmagic/registry/ModRituals.java
Normal file
19
src/main/java/WayofTime/bloodmagic/registry/ModRituals.java
Normal file
|
@ -0,0 +1,19 @@
|
|||
package WayofTime.bloodmagic.registry;
|
||||
|
||||
import WayofTime.bloodmagic.api.registry.ImperfectRitualRegistry;
|
||||
import WayofTime.bloodmagic.api.ritual.imperfect.ImperfectRitual;
|
||||
import WayofTime.bloodmagic.ritual.imperfect.ImperfectRitualNight;
|
||||
|
||||
public class ModRituals {
|
||||
|
||||
public static ImperfectRitual imperfectNight;
|
||||
|
||||
public static void initRituals() {
|
||||
|
||||
}
|
||||
|
||||
public static void initImperfectRituals() {
|
||||
imperfectNight = new ImperfectRitualNight();
|
||||
ImperfectRitualRegistry.registerRitual(imperfectNight, imperfectNight.getName());
|
||||
}
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
package WayofTime.bloodmagic.ritual.imperfect;
|
||||
|
||||
import WayofTime.bloodmagic.api.BlockStack;
|
||||
import WayofTime.bloodmagic.api.ritual.imperfect.IImperfectRitualStone;
|
||||
import WayofTime.bloodmagic.api.ritual.imperfect.ImperfectRitual;
|
||||
import net.minecraft.entity.effect.EntityLightningBolt;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.init.Blocks;
|
||||
|
||||
public class ImperfectRitualNight extends ImperfectRitual {
|
||||
|
||||
public ImperfectRitualNight() {
|
||||
super("night", new BlockStack(Blocks.lapis_block), 5000, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onActivate(IImperfectRitualStone imperfectRitualStone, EntityPlayer player) {
|
||||
|
||||
boolean retFlag = false;
|
||||
|
||||
if (!imperfectRitualStone.getWorld().isRemote) {
|
||||
imperfectRitualStone.getWorld().addWeatherEffect(new EntityLightningBolt(imperfectRitualStone.getWorld(), imperfectRitualStone.getPos().getX(), imperfectRitualStone.getPos().getY() + 2, imperfectRitualStone.getPos().getZ()));
|
||||
imperfectRitualStone.getWorld().setWorldTime((imperfectRitualStone.getWorld().getWorldTime() / 24000) * 24000 + 13800);
|
||||
retFlag = true;
|
||||
}
|
||||
|
||||
return retFlag;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,41 @@
|
|||
package WayofTime.bloodmagic.tile;
|
||||
|
||||
import WayofTime.bloodmagic.api.registry.ImperfectRitualRegistry;
|
||||
import WayofTime.bloodmagic.api.ritual.imperfect.IImperfectRitualStone;
|
||||
import WayofTime.bloodmagic.api.ritual.imperfect.ImperfectRitual;
|
||||
import WayofTime.bloodmagic.api.util.helper.NetworkHelper;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public class TileImperfectRitualStone extends TileEntity implements IImperfectRitualStone {
|
||||
|
||||
public TileImperfectRitualStone() {
|
||||
|
||||
}
|
||||
|
||||
// IImperfectRitualStone
|
||||
|
||||
@Override
|
||||
public boolean performRitual(World world, BlockPos pos, ImperfectRitual imperfectRitual, EntityPlayer player) {
|
||||
|
||||
if (imperfectRitual != null && ImperfectRitualRegistry.ritualEnabled(imperfectRitual)) {
|
||||
System.out.println(imperfectRitual.toString());
|
||||
NetworkHelper.getSoulNetwork(player.getDisplayNameString(), world).syphonAndDamage(imperfectRitual.getActivationCost());
|
||||
return imperfectRitual.onActivate(this, player);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public World getWorld() {
|
||||
return super.getWorld();
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockPos getPos() {
|
||||
return super.getPos();
|
||||
}
|
||||
}
|
|
@ -5,9 +5,9 @@ import WayofTime.bloodmagic.api.event.RitualEvent;
|
|||
import WayofTime.bloodmagic.api.network.SoulNetwork;
|
||||
import WayofTime.bloodmagic.api.registry.RitualRegistry;
|
||||
import WayofTime.bloodmagic.api.ritual.IMasterRitualStone;
|
||||
import WayofTime.bloodmagic.api.ritual.LocalRitualStorage;
|
||||
import WayofTime.bloodmagic.api.ritual.Ritual;
|
||||
import WayofTime.bloodmagic.api.util.helper.NetworkHelper;
|
||||
import WayofTime.bloodmagic.api.util.helper.RitualHelper;
|
||||
import WayofTime.bloodmagic.item.ItemActivationCrystal;
|
||||
import WayofTime.bloodmagic.util.ChatUtil;
|
||||
import com.google.common.base.Strings;
|
||||
|
@ -35,9 +35,6 @@ public class TileMasterRitualStone extends TileEntity implements IMasterRitualSt
|
|||
private Ritual currentRitual;
|
||||
private EnumFacing direction;
|
||||
|
||||
public LocalRitualStorage storage;
|
||||
public NBTTagCompound customTag;
|
||||
|
||||
public TileMasterRitualStone() {
|
||||
|
||||
}
|
||||
|
@ -59,23 +56,28 @@ public class TileMasterRitualStone extends TileEntity implements IMasterRitualSt
|
|||
|
||||
}
|
||||
|
||||
public void activateRitual(ItemStack activationCrystal, EntityPlayer activator) {
|
||||
@Override
|
||||
public boolean activateRitual(ItemStack activationCrystal, EntityPlayer activator) {
|
||||
activationCrystal = NBTHolder.checkNBT(activationCrystal);
|
||||
String crystalOwner = activationCrystal.getTagCompound().getString(NBTHolder.NBT_OWNER);
|
||||
Ritual ritual = null;
|
||||
Ritual ritual = RitualRegistry.getRitualForId("");
|
||||
|
||||
if (!Strings.isNullOrEmpty(crystalOwner)) {
|
||||
if (!Strings.isNullOrEmpty(crystalOwner) && ritual != null) {
|
||||
if (activationCrystal.getItem() instanceof ItemActivationCrystal) {
|
||||
int crystalLevel = ((ItemActivationCrystal) activationCrystal.getItem()).getCrystalLevel(activationCrystal);
|
||||
if (RitualHelper.canCrystalActivate(ritual, crystalLevel)) {
|
||||
|
||||
RitualEvent.RitualActivatedEvent event = new RitualEvent.RitualActivatedEvent(this, crystalOwner, ritual, activator, activationCrystal, crystalLevel);
|
||||
RitualEvent.RitualActivatedEvent event = new RitualEvent.RitualActivatedEvent(this, crystalOwner, ritual, activator, activationCrystal, crystalLevel);
|
||||
|
||||
if (MinecraftForge.EVENT_BUS.post(event) || event.getResult() == Event.Result.DENY) {
|
||||
ChatUtil.sendNoSpamUnloc(activator, "chat.BloodMagic.ritual.prevent");
|
||||
return;
|
||||
if (MinecraftForge.EVENT_BUS.post(event) || event.getResult() == Event.Result.DENY) {
|
||||
ChatUtil.sendNoSpamUnloc(activator, "chat.BloodMagic.ritual.prevent");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -87,6 +89,11 @@ public class TileMasterRitualStone extends TileEntity implements IMasterRitualSt
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void stopRitual() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setCooldown(int cooldown) {
|
||||
this.cooldown = cooldown;
|
||||
|
@ -107,16 +114,6 @@ public class TileMasterRitualStone extends TileEntity implements IMasterRitualSt
|
|||
return direction;
|
||||
}
|
||||
|
||||
@Override
|
||||
public NBTTagCompound getCustomRitualTag() {
|
||||
return customTag;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setCustomRitualTag(NBTTagCompound tag) {
|
||||
this.customTag = tag;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areTanksEmpty() {
|
||||
return false;
|
||||
|
@ -127,16 +124,6 @@ public class TileMasterRitualStone extends TileEntity implements IMasterRitualSt
|
|||
return activeTime;
|
||||
}
|
||||
|
||||
@Override
|
||||
public LocalRitualStorage getLocalStorage() {
|
||||
return storage;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setLocalStorage(LocalRitualStorage storage) {
|
||||
this.storage = storage;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getOwner() {
|
||||
return owner;
|
||||
|
|
|
@ -0,0 +1,27 @@
|
|||
{
|
||||
"forge_marker": 1,
|
||||
"defaults": {
|
||||
"textures": { },
|
||||
"model": "bloodmagic:BlockAltar.obj",
|
||||
"custom": { "flip-v": true },
|
||||
"transform": {
|
||||
"translation": [ 0.05, -0.5, 0.05 ],
|
||||
"scale": [ 0.1, 0.1, 0.1 ]
|
||||
}
|
||||
},
|
||||
"variants": {
|
||||
"normal": [{
|
||||
|
||||
}],
|
||||
"inventory": [{
|
||||
"transform": {
|
||||
"translation": [ 0.05, -0.1, 0.05 ],
|
||||
"scale": [ 0.07, 0.07, 0.07 ],
|
||||
"gui": {
|
||||
"translation": [ 0, -0.15, -0.03 ],
|
||||
"scale": [ 1.04, 1.04, 1.04 ]
|
||||
}
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
# Blender MTL File: 'None'
|
||||
# Material Count: 1
|
||||
|
||||
newmtl Material__46
|
||||
Ns 96.078431
|
||||
Ka 1.000000 1.000000 1.000000
|
||||
Kd 0.640000 0.640000 0.640000
|
||||
Ks 0.500000 0.500000 0.500000
|
||||
Ke 0.000000 0.000000 0.000000
|
||||
Ni 1.000000
|
||||
d 1.000000
|
||||
illum 2
|
||||
map_Kd bloodmagic:models/altar
|
238
src/main/resources/assets/bloodmagic/models/block/BlockAltar.obj
Normal file
238
src/main/resources/assets/bloodmagic/models/block/BlockAltar.obj
Normal file
|
@ -0,0 +1,238 @@
|
|||
# Blender v2.76 (sub 0) OBJ File: ''
|
||||
# www.blender.org
|
||||
mtllib BlockAltar.mtl
|
||||
o headusOBJexport002
|
||||
v -4.500000 0.499699 7.000000
|
||||
v 4.500000 0.499699 7.000000
|
||||
v 4.017200 8.499999 6.248302
|
||||
v -4.017200 8.499999 6.248302
|
||||
v 6.937900 0.499699 4.499400
|
||||
v 7.019900 0.499701 -4.499800
|
||||
v 6.260000 8.500001 -4.017699
|
||||
v 6.186800 8.500000 4.015902
|
||||
v -4.017200 8.500001 -6.249599
|
||||
v 4.017200 8.500001 -6.249599
|
||||
v 4.500000 0.499701 -7.000000
|
||||
v -4.500000 0.499701 -7.000000
|
||||
v -6.248900 8.500000 4.016501
|
||||
v -6.248900 8.500001 -4.062199
|
||||
v -7.000000 0.499701 -4.549700
|
||||
v -7.000000 0.499699 4.500000
|
||||
v -5.643700 0.499701 -7.721900
|
||||
v -7.698300 0.499701 -5.708200
|
||||
v -6.996700 8.500001 -5.252799
|
||||
v -5.192700 8.500001 -7.020998
|
||||
v -5.200200 8.499999 7.007902
|
||||
v -7.008600 8.499999 5.199602
|
||||
v -7.710200 0.499699 5.651200
|
||||
v -5.651300 0.499699 7.710100
|
||||
v 5.651300 0.499699 7.710100
|
||||
v 7.710200 0.499699 5.651200
|
||||
v 7.008600 8.499999 5.199602
|
||||
v 5.200200 8.499999 7.007902
|
||||
v 7.710200 0.499701 -5.651300
|
||||
v 5.651300 0.499701 -7.710200
|
||||
v 5.200300 8.500001 -7.009199
|
||||
v 7.008600 8.500001 -5.200899
|
||||
v 1.791200 8.500000 3.281701
|
||||
v -1.791000 8.500000 3.281701
|
||||
v 3.285700 8.500000 -1.794999
|
||||
v 3.285700 8.500000 1.787201
|
||||
v -1.790600 8.500001 -3.289699
|
||||
v 1.791200 8.500001 -3.289499
|
||||
v -3.285500 8.500000 1.787201
|
||||
v -3.285300 8.500000 -1.814699
|
||||
v -1.284500 7.000000 2.059001
|
||||
v -1.288900 7.000000 -2.066799
|
||||
v -2.062600 7.000000 -1.303299
|
||||
v -2.062700 7.000000 1.280801
|
||||
v 1.284600 7.000000 2.059001
|
||||
v 2.062900 7.000000 1.280801
|
||||
v 2.062900 7.000000 -1.288499
|
||||
v 1.284700 7.000000 -2.066699
|
||||
vt -0.000000 0.265600
|
||||
vt 0.203100 0.265600
|
||||
vt 0.203100 0.500000
|
||||
vt 0.000000 0.500000
|
||||
vt 0.390600 0.265600
|
||||
vt 0.593800 0.265600
|
||||
vt 0.593800 0.500000
|
||||
vt 0.390600 0.500000
|
||||
vt 0.203100 0.234400
|
||||
vt -0.000000 0.234400
|
||||
vt -0.000000 0.000000
|
||||
vt 0.203100 0.000000
|
||||
vt 0.593800 0.234400
|
||||
vt 0.390600 0.234400
|
||||
vt 0.390600 -0.000000
|
||||
vt 0.593800 0.000000
|
||||
vt 0.250000 0.000000
|
||||
vt 0.343800 0.000000
|
||||
vt 0.343800 0.234400
|
||||
vt 0.250000 0.234400
|
||||
vt 0.734400 0.234400
|
||||
vt 0.640600 0.234400
|
||||
vt 0.640600 0.000000
|
||||
vt 0.734400 -0.000000
|
||||
vt 0.250000 0.265600
|
||||
vt 0.343800 0.265600
|
||||
vt 0.343800 0.500000
|
||||
vt 0.250000 0.500000
|
||||
vt 0.640600 0.265600
|
||||
vt 0.734400 0.265600
|
||||
vt 0.734400 0.500000
|
||||
vt 0.640600 0.500000
|
||||
vt 0.093800 0.578100
|
||||
vt 0.031300 0.640600
|
||||
vt 0.000000 0.609400
|
||||
vt 0.062500 0.546900
|
||||
vt 0.031300 0.906300
|
||||
vt 0.093800 0.968800
|
||||
vt 0.062500 1.000000
|
||||
vt 0.000000 0.937500
|
||||
vt 0.375000 0.968800
|
||||
vt 0.437500 0.906300
|
||||
vt 0.468800 0.937500
|
||||
vt 0.406300 1.000000
|
||||
vt 0.437500 0.640600
|
||||
vt 0.375000 0.578100
|
||||
vt 0.406300 0.546900
|
||||
vt 0.468800 0.609400
|
||||
vt 0.909700 0.627000
|
||||
vt 0.852200 0.704200
|
||||
vt 0.759300 0.704500
|
||||
vt 0.701200 0.627800
|
||||
vt 0.968900 0.893100
|
||||
vt 0.891500 0.835700
|
||||
vt 0.891100 0.742800
|
||||
vt 0.966200 0.684700
|
||||
vt 0.702500 0.952000
|
||||
vt 0.760000 0.875000
|
||||
vt 0.852900 0.874700
|
||||
vt 0.910900 0.951200
|
||||
vt 0.643600 0.685900
|
||||
vt 0.720700 0.743500
|
||||
vt 0.721000 0.836900
|
||||
vt 0.644400 0.895500
|
||||
vt 0.988400 0.923700
|
||||
vt 0.941700 0.970800
|
||||
vt 0.781300 0.265600
|
||||
vt 0.781300 0.500000
|
||||
vt 0.672100 0.972200
|
||||
vt 0.625100 0.926500
|
||||
vt 0.623700 0.655300
|
||||
vt 0.670500 0.608200
|
||||
vt 0.781300 -0.000000
|
||||
vt 0.781300 0.234400
|
||||
vt 0.940300 0.607200
|
||||
vt 0.987400 0.653900
|
||||
vt 0.772500 0.736200
|
||||
vt 0.772800 0.843200
|
||||
vt 0.752700 0.823500
|
||||
vt 0.752400 0.756500
|
||||
vt 0.839200 0.736000
|
||||
vt 0.859500 0.756100
|
||||
vt 0.859700 0.822700
|
||||
vt 0.839600 0.843000
|
||||
vn 0.000000 0.093500 0.995600
|
||||
vn 0.995500 0.094000 0.009100
|
||||
vn 0.000000 0.093400 -0.995600
|
||||
vn -0.995600 0.093500 0.000000
|
||||
vn -0.101800 -0.554900 -0.825700
|
||||
vn -0.823200 -0.555100 -0.118900
|
||||
vn -0.990700 0.094300 -0.098300
|
||||
vn -0.076900 0.091300 -0.992800
|
||||
vn -0.088200 0.093800 0.991700
|
||||
vn -0.991900 0.091900 0.087200
|
||||
vn -0.824800 -0.554700 0.109900
|
||||
vn -0.110600 -0.555300 0.824300
|
||||
vn 0.109900 -0.554700 0.824800
|
||||
vn 0.827400 -0.553300 0.096000
|
||||
vn 0.993300 0.092700 0.069000
|
||||
vn 0.087200 0.092000 0.991900
|
||||
vn 0.823800 -0.555200 -0.114500
|
||||
vn 0.110600 -0.555300 -0.824300
|
||||
vn 0.088200 0.093700 -0.991700
|
||||
vn 0.991600 0.092100 -0.090800
|
||||
vn 0.223200 -0.908300 -0.353700
|
||||
vn -0.359200 -0.907600 0.217500
|
||||
vn -0.356900 -0.907800 -0.220200
|
||||
vn 0.220600 -0.908000 0.356100
|
||||
vn -0.220100 -0.907800 0.356900
|
||||
vn 0.343700 -0.910100 -0.231300
|
||||
vn 0.361700 -0.906700 0.216800
|
||||
vn -0.220600 -0.908000 -0.356100
|
||||
vn 0.000000 1.000000 0.000000
|
||||
vn -0.538100 0.043900 0.841700
|
||||
vn 0.546500 0.042800 -0.836400
|
||||
vn -0.841700 0.043800 -0.538100
|
||||
vn -0.539700 0.046300 -0.840600
|
||||
vn 0.845600 0.044700 0.531900
|
||||
vn -0.845900 0.047000 0.531300
|
||||
vn 0.539700 0.046400 0.840600
|
||||
vn 0.187200 0.872200 -0.452000
|
||||
vn 0.185600 0.872300 0.452300
|
||||
vn 0.451600 0.872000 0.188800
|
||||
vn 0.452000 0.872200 -0.187200
|
||||
vn -0.187200 0.872200 -0.452000
|
||||
vn 0.287000 0.661600 -0.692800
|
||||
vn -0.287000 0.661600 -0.692800
|
||||
vn -0.451900 0.872200 -0.187200
|
||||
vn -0.692800 0.661600 -0.286900
|
||||
vn -0.451900 0.872200 0.187200
|
||||
vn -0.692800 0.661600 0.286900
|
||||
vn -0.187200 0.872200 0.451900
|
||||
vn -0.287000 0.661600 0.692700
|
||||
vn 0.284800 0.661100 0.694100
|
||||
vn 0.691400 0.662100 0.289100
|
||||
vn 0.692800 0.661600 -0.286900
|
||||
vn 0.820700 0.042600 -0.569800
|
||||
usemtl Material__46
|
||||
s off
|
||||
f 1/1/1 2/2/1 3/3/1 4/4/1
|
||||
f 5/5/2 6/6/2 7/7/2 8/8/2
|
||||
f 9/9/3 10/10/3 11/11/3 12/12/3
|
||||
f 13/13/4 14/14/4 15/15/4 16/16/4
|
||||
s 1
|
||||
f 17/17/5 18/18/6 19/19/7 20/20/8
|
||||
f 21/21/9 22/22/10 23/23/11 24/24/12
|
||||
f 25/25/13 26/26/14 27/27/15 28/28/16
|
||||
f 29/29/17 30/30/18 31/31/19 32/32/20
|
||||
f 12/33/21 15/34/22 18/35/6 17/36/5
|
||||
f 16/37/23 1/38/24 24/39/12 23/40/11
|
||||
f 2/41/25 5/42/26 26/43/14 25/44/13
|
||||
f 6/45/27 11/46/28 30/47/18 29/48/17
|
||||
f 3/49/29 33/50/29 34/51/29 4/52/29
|
||||
f 7/53/29 35/54/29 36/55/29 8/56/29
|
||||
f 9/57/29 37/58/29 38/59/29 10/60/29
|
||||
f 13/61/29 39/62/29 40/63/29 14/64/29
|
||||
f 9/57/29 14/64/29 40/63/29 37/58/29
|
||||
f 4/52/29 34/51/29 39/62/29 13/61/29
|
||||
f 8/56/29 36/55/29 33/50/29 3/49/29
|
||||
f 10/60/29 38/59/29 35/54/29 7/53/29
|
||||
f 25/25/13 28/28/16 3/3/30 2/2/25
|
||||
f 10/60/29 7/53/29 32/65/29 31/66/29
|
||||
f 17/17/5 20/20/8 9/9/31 12/12/21
|
||||
f 23/23/11 22/22/10 13/13/32 16/16/23
|
||||
f 11/67/28 10/68/33 31/31/19 30/30/18
|
||||
f 29/29/17 32/32/20 7/7/34 6/6/27
|
||||
f 14/64/29 9/57/29 20/69/29 19/70/29
|
||||
f 15/15/22 14/14/35 19/19/7 18/18/6
|
||||
f 4/52/29 13/61/29 22/71/29 21/72/29
|
||||
f 1/73/24 4/74/36 21/21/9 24/24/12
|
||||
f 8/56/29 3/49/29 28/75/29 27/76/29
|
||||
f 41/77/37 42/78/38 43/79/39 44/80/40
|
||||
f 45/81/41 41/77/37 34/51/42 33/50/43
|
||||
f 46/82/44 45/81/41 33/50/43 36/55/45
|
||||
f 47/83/46 46/82/44 36/55/45 35/54/47
|
||||
f 48/84/48 47/83/46 35/54/47 38/59/49
|
||||
f 42/78/38 48/84/48 38/59/49 37/58/50
|
||||
f 43/79/39 42/78/38 37/58/50 40/63/51
|
||||
f 44/80/40 43/79/39 40/63/51 39/62/52
|
||||
f 41/77/37 44/80/40 39/62/52 34/51/42
|
||||
f 48/84/48 45/81/41 46/82/44 47/83/46
|
||||
f 45/81/41 48/84/48 42/78/38 41/77/37
|
||||
f 16/37/23 15/34/22 12/33/21 1/38/24
|
||||
f 2/41/25 11/46/28 6/45/27 5/42/26
|
||||
f 11/46/28 2/41/25 1/38/24 12/33/21
|
||||
f 5/5/26 8/8/53 27/27/15 26/26/14
|
Loading…
Reference in a new issue