kihira.minicreatures.MiniCreatures.java Source code

Java tutorial

Introduction

Here is the source code for kihira.minicreatures.MiniCreatures.java

Source

/*
 * Copyright (C) 2014  Kihira
 *
 *     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 2 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.
 */

package kihira.minicreatures;

import com.google.gson.Gson;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.SidedProxy;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.event.FMLServerStartingEvent;
import cpw.mods.fml.common.network.NetworkRegistry;
import cpw.mods.fml.common.registry.EntityRegistry;
import kihira.foxlib.common.gson.GsonHelper;
import kihira.minicreatures.common.CommandSpawnEntity;
import kihira.minicreatures.common.entity.*;
import kihira.minicreatures.common.handler.EventHandler;
import kihira.minicreatures.common.handler.GuiHandler;
import kihira.minicreatures.common.item.ItemCustomizer;
import kihira.minicreatures.common.personality.Mood;
import kihira.minicreatures.common.personality.MoodTest;
import kihira.minicreatures.common.personality.MoodVariable;
import kihira.minicreatures.common.personality.Personality;
import kihira.minicreatures.proxy.CommonProxy;
import net.minecraft.entity.EnumCreatureType;
import net.minecraft.world.biome.BiomeGenBase;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.config.Configuration;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.io.*;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

@Mod(modid = "minicreatures", name = "Mini Creatures", version = "${version}", useMetadata = true, dependencies = "required-after:foxlib@[0.2.0,)")
public class MiniCreatures {

    @SidedProxy(clientSide = "kihira.minicreatures.proxy.ClientProxy", serverSide = "kihira.minicreatures.proxy.CommonProxy")
    public static CommonProxy proxy;

    @Mod.Instance()
    public static MiniCreatures instance;
    public static final Logger logger = LogManager.getLogger("MiniCreatues");

    public static final ItemCustomizer itemCustomizer = new ItemCustomizer();
    //public static final ItemMindControlHelmet itemMindControlHelmet = new ItemMindControlHelmet();

    public static boolean enableMiniFoxes;
    public static boolean enableMiniTRex;
    public static boolean enableMiniPlayers;
    public static boolean enableMiniShark;
    public static boolean enableMiniRedPandas;
    public static boolean enableCustomizer;
    public static int randomNameChance;

    private static boolean hasGottenNames = false;

    @Mod.EventHandler
    public void preInit(FMLPreInitializationEvent e) {
        loadConfig(e.getSuggestedConfigurationFile());
        proxy.registerRenderers();
        registerEntities();
        proxy.registerItems();
        proxy.registerCustomizerParts();
        proxy.registerMessages();
        NetworkRegistry.INSTANCE.registerGuiHandler(instance, new GuiHandler());
        MinecraftForge.EVENT_BUS.register(new EventHandler());

        loadPersonalityTypes(e.getModConfigurationDirectory());
    }

    @Mod.EventHandler
    public void serverStarting(FMLServerStartingEvent e) {
        e.registerServerCommand(new CommandSpawnEntity());

        if (!hasGottenNames) {
            Runnable getNamesRunnable = new Runnable() {
                private String namesLoc = "https://raw.github.com/kihira/MiniCreatures/master/src/main/resources/assets/minicreatures/text/names.json";

                @Override
                public void run() {
                    try {
                        Gson gson = GsonHelper.createGson();
                        Reader reader = new InputStreamReader(new URL(this.namesLoc).openStream());
                        //Reader reader = new InputStreamReader(MiniCreatures.class.getResourceAsStream("/assets/minicreatures/text/names.json"));
                        String[] names = gson.fromJson(reader, String[].class);
                        reader.close();

                        if (names != null && names.length > 0) {
                            EventHandler.names = names;
                        }

                    } catch (Exception e1) {
                        logger.debug(e1);
                    }
                }
            };
            getNamesRunnable.run();
            hasGottenNames = true;
        }
    }

    private void loadConfig(File configFile) {
        Configuration configuration = new Configuration(configFile);
        configuration.load();

        enableMiniFoxes = configuration.getBoolean("Enable Mini Fox", Configuration.CATEGORY_GENERAL, true, "");
        enableMiniTRex = configuration.getBoolean("Enable Mini T-Rex", Configuration.CATEGORY_GENERAL, true, "");
        enableMiniPlayers = configuration.getBoolean("Enable Mini Players", Configuration.CATEGORY_GENERAL, false,
                "This feature is still in development and may cause issues");
        enableMiniShark = configuration.getBoolean("Enable Mini Sharks", Configuration.CATEGORY_GENERAL, true, "");
        enableMiniRedPandas = configuration.getBoolean("Enable Mini Red Pandas", Configuration.CATEGORY_GENERAL,
                true, "");
        enableCustomizer = configuration.getBoolean("Enable Customizer", Configuration.CATEGORY_GENERAL, false,
                "This feature is still in development and may cause issues");
        randomNameChance = configuration.getInt("Random Name Chance", Configuration.CATEGORY_GENERAL, 200, 0, 500,
                "Chance that a Mini Creature will randomly spawn with a name. Higher = lower chance. Set to 0 to disable");

        if (configuration.hasChanged()) {
            configuration.save();
        }
    }

    @SuppressWarnings("ResultOfMethodCallIgnored")
    private void loadPersonalityTypes(File configDir) {
        File personalityTypesFile = new File(configDir,
                File.separator + "MiniCreatures" + File.separator + "PersonalityTypes.json");

        try {
            Gson gson = GsonHelper.createGson(Mood.class);
            if (!personalityTypesFile.exists()) {
                //Create files/directories
                new File(configDir, File.separator + "MiniCreatures").mkdirs();
                personalityTypesFile.createNewFile();

                JsonWriter jsonWriter = new JsonWriter(new FileWriter(personalityTypesFile));

                //TODO just copy a pre-genned file like marker beacons
                //Create defaults
                //Create default personalities
                jsonWriter.beginArray();
                List<String> list = new ArrayList<String>();
                list.add(EntityMiniPlayer.class.getName());
                gson.toJson(gson.toJsonTree(new Mood("psychotic", list, new HashMap<String, MoodVariable>() {
                    {
                        put("happiness", new MoodVariable(35, 50));
                        put("hostility", new MoodVariable(40, 50));
                    }
                })), jsonWriter);
                gson.toJson(gson.toJsonTree(new Mood("coldblooded", list, new HashMap<String, MoodVariable>() {
                    {
                        put("happiness", new MoodVariable(-50, 0));
                        put("hostility", new MoodVariable(40, 50));
                    }
                })), jsonWriter);
                gson.toJson(gson.toJsonTree(new Mood("happy", list, new HashMap<String, MoodVariable>() {
                    {
                        put("happiness", new MoodVariable(10, 50));
                        put("hostility", new MoodVariable(-50, 10));
                    }
                })), jsonWriter);
                gson.toJson(gson.toJsonTree(new Mood("depressed", list, new HashMap<String, MoodVariable>() {
                    {
                        put("happiness", new MoodVariable(-50, 0));
                        put("hostility", new MoodVariable(-10, 10));
                    }
                })), jsonWriter);
                gson.toJson(gson.toJsonTree(new MoodTest("test")), jsonWriter);
                jsonWriter.endArray();
                jsonWriter.close();
            }

            //Load personality types
            JsonReader reader = new JsonReader(new FileReader(personalityTypesFile));
            reader.beginArray();
            while (reader.hasNext()) {
                Mood mood = gson.fromJson(reader, Mood.class);
                Personality.moodList.add(mood);
                logger.debug("Loaded mood %s", mood.toString());
            }
            reader.endArray();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }

    public void registerEntities() {
        if (enableMiniFoxes) {
            EntityRegistry.registerModEntity(EntityFox.class, "MiniFox", 0, this, 64, 1, true);
            EntityRegistry.addSpawn(EntityFox.class, 6, 2, 4, EnumCreatureType.creature, BiomeGenBase.plains,
                    BiomeGenBase.forest, BiomeGenBase.forestHills);
        }
        if (enableMiniTRex) {
            EntityRegistry.registerModEntity(EntityTRex.class, "MiniTRex", 1, this, 64, 1, true);
            EntityRegistry.addSpawn(EntityTRex.class, 2, 1, 2, EnumCreatureType.creature, BiomeGenBase.jungle,
                    BiomeGenBase.jungleHills);
        }
        if (enableMiniPlayers)
            EntityRegistry.registerModEntity(EntityMiniPlayer.class, "MiniPlayer", 2, this, 64, 1, true);
        if (enableMiniShark) {
            EntityRegistry.registerModEntity(EntityMiniShark.class, "MiniShark", 3, this, 64, 1, true);
            EntityRegistry.addSpawn(EntityTRex.class, 10, 2, 4, EnumCreatureType.waterCreature, BiomeGenBase.ocean,
                    BiomeGenBase.deepOcean);
        }
        if (enableMiniRedPandas) {
            EntityRegistry.registerModEntity(EntityRedPanda.class, "MiniRedPanda", 4, this, 64, 1, true);
            EntityRegistry.addSpawn(EntityRedPanda.class, 6, 2, 4, EnumCreatureType.creature, BiomeGenBase.forest,
                    BiomeGenBase.forestHills, BiomeGenBase.birchForest, BiomeGenBase.birchForestHills);
        }
    }
}