    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
    015    package cpw.mods.fml.common.modloader;
    016
    017    import java.util.EnumSet;
    018
    019    import cpw.mods.fml.common.FMLCommonHandler;
    020    import cpw.mods.fml.common.ITickHandler;
    021    import cpw.mods.fml.common.TickType;
    022
    023    /**
    024     * @author cpw
    025     *
    026     */
    027    public 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    }