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}