    001/*
    002 * The FML Forge Mod Loader suite.
    003 * Copyright (C) 2012 cpw
    004 *
    005 * This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free
    006 * Software Foundation; either version 2.1 of the License, or any later version.
    007 *
    008 * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
    009 * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
    010 *
    011 * You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51
    012 * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
    013 */
    014
    015package cpw.mods.fml.common.modloader;
    016
    017import java.util.EnumSet;
    018
    019import cpw.mods.fml.common.FMLCommonHandler;
    020import cpw.mods.fml.common.ITickHandler;
    021import cpw.mods.fml.common.TickType;
    022
    023/**
    024 * @author cpw
    025 *
    026 */
    027public class BaseModTicker implements ITickHandler
    028{
    029
    030    private BaseModProxy mod;
    031    private EnumSet<TickType> ticks;
    032    private boolean clockTickTrigger;
    033    private boolean sendGuiTicks;
    034
    035
    036    BaseModTicker(BaseModProxy mod, boolean guiTicker)
    037    {
    038        this.mod = mod;
    039        this.ticks = EnumSet.of(TickType.WORLDLOAD);
    040        this.sendGuiTicks = guiTicker;
    041    }
    042
    043    BaseModTicker(EnumSet<TickType> ticks, boolean guiTicker)
    044    {
    045        this.ticks = ticks;
    046        this.sendGuiTicks = guiTicker;
    047    }
    048
    049    @Override
    050    public void tickStart(EnumSet<TickType> types, Object... tickData)
    051    {
    052        tickBaseMod(types, false, tickData);
    053    }
    054
    055    @Override
    056    public void tickEnd(EnumSet<TickType> types, Object... tickData)
    057    {
    058        tickBaseMod(types, true, tickData);
    059    }
    060
    061    private void tickBaseMod(EnumSet<TickType> types, boolean end, Object... tickData)
    062    {
    063        if (FMLCommonHandler.instance().getSide().isClient() && ( ticks.contains(TickType.CLIENT) || ticks.contains(TickType.WORLDLOAD)))
    064        {
    065            EnumSet cTypes=EnumSet.copyOf(types);
    066            if ( ( end && types.contains(TickType.CLIENT)) || types.contains(TickType.WORLDLOAD))
    067            {
    068                clockTickTrigger =  true;
    069                cTypes.remove(TickType.CLIENT);
    070                cTypes.remove(TickType.WORLDLOAD);
    071            }
    072
    073            if (end && clockTickTrigger && types.contains(TickType.RENDER))
    074            {
    075                clockTickTrigger = false;
    076                cTypes.remove(TickType.RENDER);
    077                cTypes.add(TickType.CLIENT);
    078            }
    079
    080            sendTick(cTypes, end, tickData);
    081        }
    082        else
    083        {
    084            sendTick(types, end, tickData);
    085        }
    086    }
    087
    088    private void sendTick(EnumSet<TickType> types, boolean end, Object... tickData)
    089    {
    090        for (TickType type : types)
    091        {
    092            if (!ticks.contains(type))
    093            {
    094                continue;
    095            }
    096
    097            boolean keepTicking=true;
    098            if (sendGuiTicks)
    099            {
    100                keepTicking = mod.doTickInGUI(type, end, tickData);
    101            }
    102            else
    103            {
    104                keepTicking = mod.doTickInGame(type, end, tickData);
    105            }
    106            if (!keepTicking) {
    107                ticks.remove(type);
    108                ticks.removeAll(type.partnerTicks());
    109            }
    110        }
    111    }
    112
    113    @Override
    114    public EnumSet<TickType> ticks()
    115    {
    116        return (clockTickTrigger ? EnumSet.of(TickType.RENDER) : ticks);
    117    }
    118
    119    @Override
    120    public String getLabel()
    121    {
    122        return mod.getClass().getSimpleName();
    123    }
    124
    125    public void setMod(BaseModProxy mod)
    126    {
    127        this.mod = mod;
    128    }
    129}