/* * This file is part of Matter Overdrive * Copyright (c) 2015., Simeon Radivoev, All rights reserved. * * Matter Overdrive 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 3 of the License, or * (at your option) any later version. * * Matter Overdrive 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. * * You should have received a copy of the GNU General Public License * along with Matter Overdrive. If not, see <http://www.gnu.org/licenses>. */ package matteroverdrive.handler; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.PlayerEvent; import cpw.mods.fml.common.gameevent.TickEvent; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import matteroverdrive.MatterOverdrive; import matteroverdrive.api.events.MOEventScan; import matteroverdrive.api.events.bionicStats.MOEventBionicStat; import matteroverdrive.api.weapon.IWeapon; import matteroverdrive.data.quest.PlayerQuestData; import matteroverdrive.entity.player.AndroidPlayer; import matteroverdrive.entity.player.MOExtendedProperties; import matteroverdrive.init.MatterOverdriveItems; import matteroverdrive.items.includes.MOBaseItem; import matteroverdrive.network.packet.client.PacketUpdateMatterRegistry; import net.minecraft.client.Minecraft; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; import net.minecraft.server.MinecraftServer; import net.minecraftforge.event.AnvilUpdateEvent; import net.minecraftforge.event.entity.living.LivingDeathEvent; import net.minecraftforge.event.entity.player.PlayerFlyableFallEvent; import java.util.ArrayList; import java.util.EnumSet; import java.util.List; /** * Created by Simeon on 5/9/2015. */ public class PlayerEventHandler { private VersionCheckerHandler versionCheckerHandler; public List<EntityPlayerMP> players; public PlayerEventHandler(ConfigurationHandler configurationHandler) { players = new ArrayList<>(); versionCheckerHandler = new VersionCheckerHandler(); configurationHandler.subscribe(versionCheckerHandler); } @SubscribeEvent public void onPlayerJoin(PlayerEvent.PlayerLoggedInEvent event) { if (event.player instanceof EntityPlayerMP) { if (MatterOverdrive.matterRegistry.hasComplitedRegistration) { if (!MinecraftServer.getServer().isSinglePlayer()) { MatterOverdrive.packetPipeline.sendTo(new PacketUpdateMatterRegistry(MatterOverdrive.matterRegistry.getEntries()), (EntityPlayerMP) event.player); } } else { players.add((EntityPlayerMP) event.player); } } } @SubscribeEvent public void onPlayerTick(TickEvent.PlayerTickEvent event) { if (event.side == Side.CLIENT) { versionCheckerHandler.onPlayerTick(event); } AndroidPlayer player = AndroidPlayer.get(event.player); if (player != null && event.phase.equals(TickEvent.Phase.START)) { if (event.side == Side.CLIENT) { onAndroidTickClient(player, event); } else { onAndroidServerTick(player, event); } } MOExtendedProperties extendedProperties = MOExtendedProperties.get(event.player); if (extendedProperties != null && event.phase.equals(TickEvent.Phase.START)) { if (event.side == Side.CLIENT) { extendedProperties.update(Side.CLIENT); }else { extendedProperties.update(Side.SERVER); } } //used to stop the item refreshing when using weapons and changing their data //this also happens on SMP and stops the beam weapons from working properly //Minecraft stops he using of items each time they change their NBT. This makes is so the weapons refresh and jitter. if (event.player.isUsingItem() && event.side == Side.CLIENT) { ItemStack itemstack = event.player.inventory.getCurrentItem(); int itemUseCount = event.player.getItemInUseCount(); if (itemstack != null && itemstack.getItem() instanceof IWeapon && itemUseCount > 0) { event.player.setItemInUse(itemstack,itemUseCount); if (Minecraft.getMinecraft().currentScreen != null && event.player.equals(Minecraft.getMinecraft().thePlayer)) event.player.clearItemInUse(); } } } @SideOnly(Side.CLIENT) private void onAndroidTickClient(AndroidPlayer androidPlayer,TickEvent.PlayerTickEvent event) { if (event.player == Minecraft.getMinecraft().thePlayer) { androidPlayer.onAndroidTick(event.side); } } private void onAndroidServerTick(AndroidPlayer androidPlayer,TickEvent.PlayerTickEvent event) { androidPlayer.onAndroidTick(event.side); } @SubscribeEvent public void onPlayerLoadFromFile(net.minecraftforge.event.entity.player.PlayerEvent.LoadFromFile event) { AndroidPlayer player = AndroidPlayer.get(event.entityPlayer); if (player != null) { player.onPlayerLoad(event); } } @SubscribeEvent public void onStartTracking(net.minecraftforge.event.entity.player.PlayerEvent.StartTracking event) { if (event.target instanceof EntityPlayer) { AndroidPlayer androidPlayer = AndroidPlayer.get((EntityPlayer)event.target); if (androidPlayer != null && androidPlayer.isAndroid()) { androidPlayer.sync(event.entityPlayer, EnumSet.allOf(AndroidPlayer.DataType.class),false); } MOExtendedProperties extendedProperties = MOExtendedProperties.get((EntityPlayer)event.target); if (extendedProperties != null) { extendedProperties.sync(EnumSet.allOf(PlayerQuestData.DataType.class)); } } } @SubscribeEvent public void onPlayerDeath(LivingDeathEvent deathEvent) { if (deathEvent.entityLiving instanceof EntityPlayer) { if (!((EntityPlayer) deathEvent.entityLiving).worldObj.isRemote) { MatterOverdrive.proxy.getGoogleAnalytics().sendEventHit(GoogleAnalyticsCommon.EVENT_CATEGORY_ENTITIES, GoogleAnalyticsCommon.EVENT_ACTION_PLAYER_DEATH, deathEvent.source.getDamageType(), ((EntityPlayer) deathEvent.entityLiving).ticksExisted / 20, (EntityPlayer) deathEvent.entityLiving); AndroidPlayer androidPlayer = AndroidPlayer.get((EntityPlayer) deathEvent.entityLiving); if (androidPlayer != null && androidPlayer.isAndroid()) { androidPlayer.onPlayerDeath(deathEvent); } } } } public void onServerTick(TickEvent.ServerTickEvent event) { if (MatterOverdrive.matterRegistry.hasComplitedRegistration) { for (int i = 0; i < MatterOverdrive.playerEventHandler.players.size();i++) { MatterOverdrive.packetPipeline.sendTo(new PacketUpdateMatterRegistry(MatterOverdrive.matterRegistry.getEntries()),MatterOverdrive.playerEventHandler.players.get(i)); } MatterOverdrive.playerEventHandler.players.clear(); } } @SubscribeEvent public void onItemCrafted(PlayerEvent.ItemCraftedEvent event) { if (event.player != null) { if (event.player.worldObj.isRemote) { if (event.crafting != null && event.crafting.getItem() instanceof MOBaseItem) { MatterOverdrive.proxy.getGoogleAnalytics().sendEventHit(GoogleAnalyticsCommon.EVENT_CATEGORY_ITEMS, GoogleAnalyticsCommon.EVENT_ACTION_CRAFT_ITEMS, event.crafting.getUnlocalizedName(), event.crafting.stackSize, event.player); } }else { MOExtendedProperties extendedProperties = MOExtendedProperties.get(event.player); if (extendedProperties != null) { extendedProperties.onEvent(event); } } } } @SubscribeEvent public void onPlayerFlyableFallEvent(PlayerFlyableFallEvent event) { if (event.entityPlayer != null) { AndroidPlayer androidPlayer = AndroidPlayer.get(event.entityPlayer); if (androidPlayer != null && androidPlayer.isAndroid()) { androidPlayer.triggerEventOnStats(event); } } } @SubscribeEvent public void onPlayerScanEvent(MOEventScan event) { if (event.getSide() == Side.SERVER && event.entityPlayer != null) { MOExtendedProperties extendedProperties = MOExtendedProperties.get(event.entityPlayer); if (extendedProperties != null) { extendedProperties.onEvent(event); } } } /*@SubscribeEvent public void onGuiOpen(GuiOpenEvent event) { MatterOverdrive.proxy.getGoogleAnalytics().sendScreenHit(event.gui != null ? event.gui.getClass().getSimpleName() : "Ingame",null); }*/ @SubscribeEvent public void onBioticStatUse(MOEventBionicStat event) { if (event.entityPlayer.worldObj.isRemote) { MatterOverdrive.proxy.getGoogleAnalytics().sendEventHit(GoogleAnalyticsCommon.EVENT_CATEGORY_BIOTIC_STATS, GoogleAnalyticsCommon.EVENT_ACTION_BIOTIC_STAT_USE, event.stat.getUnlocalizedName(), event.android.getPlayer()); } } @SubscribeEvent public void onAnvilRepair(AnvilUpdateEvent event) { if (event.left != null && event.right != null && event.left.getItem() == MatterOverdriveItems.portableDecomposer) { event.output = event.left.copy(); event.materialCost = 1; event.cost = 3; MatterOverdriveItems.portableDecomposer.addStackToList(event.output,event.right); } } }