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 }