protected override void UseForPlayer(Player player, ItemsBean itemData, ItemUseTypeEnum useType) { //检测玩家前方是否有方块 if (player.playerRay.RayToChunkBlock(out RaycastHit hit, out Vector3Int targetBlockPosition)) { ChunkComponent chunkForHit = hit.collider.GetComponentInParent <ChunkComponent>(); if (chunkForHit != null) { //获取位置和方向 player.playerRay.GetHitPositionAndDirection(hit, out Vector3Int targetPosition, out Vector3Int closePosition, out BlockDirectionEnum direction); if (useType == ItemUseTypeEnum.Left) { TargetBreak(itemData, targetPosition); } else { Vector3Int localPosition = targetPosition - chunkForHit.chunk.chunkData.positionForWorld; //获取原位置方块 Block tagetBlock = chunkForHit.chunk.chunkData.GetBlockForLocal(localPosition); //如果不能锄地 if (tagetBlock.blockInfo.plough_state == 0) { return; } //获取上方方块 Block upBlock = chunkForHit.chunk.chunkData.GetBlockForLocal(localPosition + Vector3Int.up); //如果上方有方块 则无法使用锄头 if (upBlock != null && upBlock.blockType != BlockTypeEnum.None) { return; } //扣除道具耐久 if (this is ItemBaseTool itemTool) { ItemsDetailsToolBean itemsDetailsTool = itemData.GetMetaData <ItemsDetailsToolBean>(); //如果没有耐久 不能锄地 if (itemsDetailsTool.life <= 0) { return; } itemsDetailsTool.AddLife(-1); //保存数据 itemData.SetMetaData(itemsDetailsTool); //回调 EventHandler.Instance.TriggerEvent(EventsInfo.ItemsBean_MetaChange, itemData); } BlockTypeEnum ploughBlockType = (BlockTypeEnum)tagetBlock.blockInfo.remark_int; //替换为耕地方块 chunkForHit.chunk.SetBlockForLocal(localPosition, ploughBlockType, direction); //播放粒子特效 BlockCptBreak.PlayBlockCptBreakEffect(ploughBlockType, targetPosition + new Vector3(0.5f, 0.5f, 0.5f)); } } } }
/// <summary> /// 使用物品 /// </summary> /// <param name="user"></param> /// <param name="itemsData"></param> /// <param name="type">0 左键 1右键 2F建</param> public void UseItem(GameObject user, ItemsBean itemsData, ItemUseTypeEnum useType) { Item item; if (itemsData == null || itemsData.itemId == 0) { //如果手上没有东西 item = manager.GetRegisterItem(itemsData.itemId, ItemsTypeEnum.Block); } else { //如果手上有东西 ItemsInfoBean itemsInfo = manager.GetItemsInfoById(itemsData.itemId); //获取对应得处理类 item = manager.GetRegisterItem(itemsInfo.id, (ItemsTypeEnum)itemsInfo.items_type); } item.Use(user, itemsData, useType); if (useType == ItemUseTypeEnum.E) { //如果是交互 则不播放动画 } else { item.UseForAnim(user, itemsData); } }
protected override void UseForPlayer(Player player, ItemsBean itemData, ItemUseTypeEnum useType) { //检测玩家前方是否有方块 if (player.playerRay.RayToChunkBlock(out RaycastHit hit, out Vector3Int targetBlockPosition)) { ChunkComponent chunkForHit = hit.collider.GetComponentInParent <ChunkComponent>(); if (chunkForHit != null) { //获取位置和方向 player.playerRay.GetHitPositionAndDirection(hit, out Vector3Int targetPosition, out Vector3Int closePosition, out BlockDirectionEnum direction); Vector3Int localPosition = targetPosition - chunkForHit.chunk.chunkData.positionForWorld; //放置位置 Vector3Int upLocalPosition = localPosition + Vector3Int.up; //获取上方方块 Block upBlock = chunkForHit.chunk.chunkData.GetBlockForLocal(upLocalPosition); //如果上方有方块 则无法放置 if (upBlock != null && upBlock.blockType != BlockTypeEnum.None) { return; } ItemsInfoBean itemsInfo = GetItemsInfo(itemData.itemId); CreatureHandler.Instance.CreateCreature(itemsInfo.type_id, targetPosition + Vector3Int.up); } } }
public override void Use(GameObject user, ItemsBean itemsData, ItemUseTypeEnum useType) { base.Use(user, itemsData, useType); //获取打中的目标 Collider[] targetArray = TargetCheck(user, itemsData); //伤害打中的目标 DamageTarget(user, itemsData, targetArray); }
protected override void UseForPlayer(Player player, ItemsBean itemData, ItemUseTypeEnum useType) { //检测玩家前方是否有方块 if (player.playerRay.RayToChunkBlock(out RaycastHit hit, out Vector3Int targetBlockPosition)) { ChunkComponent chunkForHit = hit.collider.GetComponentInParent <ChunkComponent>(); if (chunkForHit != null) { //获取位置和方向 player.playerRay.GetHitPositionAndDirection(hit, out Vector3Int targetPosition, out Vector3Int closePosition, out BlockDirectionEnum direction); Vector3Int localPosition = targetPosition - chunkForHit.chunk.chunkData.positionForWorld; //获取原位置方块 Block tagetBlock = chunkForHit.chunk.chunkData.GetBlockForLocal(localPosition); //如果不能种地 if (tagetBlock.blockInfo.plant_state == 0) { return; } //种植位置 Vector3Int upLocalPosition = localPosition + Vector3Int.up; //获取上方方块 Block upBlock = chunkForHit.chunk.chunkData.GetBlockForLocal(upLocalPosition); //如果上方有方块 则无法种植 if (upBlock != null && upBlock.blockType != BlockTypeEnum.None) { return; } //种植的方块 ItemsInfoBean itemsInfo = GetItemsInfo(itemData.itemId); BlockTypeEnum plantBlockType = (BlockTypeEnum)itemsInfo.type_id; //初始化meta数据 BlockMetaCrop blockCropData = new BlockMetaCrop(); blockCropData.isStartGrow = false; blockCropData.growPro = 0; string metaData = BlockBaseCrop.ToMetaData(blockCropData); //替换为种植 chunkForHit.chunk.SetBlockForLocal(upLocalPosition, plantBlockType, BlockDirectionEnum.UpForward, metaData); //扣除道具 UserDataBean userData = GameDataHandler.Instance.manager.GetUserData(); userData.AddItems(itemData, -1); //刷新UI UIHandler.Instance.RefreshUI(); } } }
public void HandleForUse(CallbackContext callback, ItemUseTypeEnum useType, bool isUserItem = true) { if (!isActiveAndEnabled) { return; } if (UGUIUtil.IsPointerUI()) { return; } this.isUseItem = isUserItem; timeForUseItem = 0; //获取道具栏上的物品 UserDataBean userData = GameDataHandler.Instance.manager.GetUserData(); ItemsBean itemsData = userData.GetItemsFromShortcut(); Player player = GameHandler.Instance.manager.player; ItemsHandler.Instance.UseItem(player.gameObject, itemsData, useType); }
/// <summary> /// 使用 /// </summary> /// <param name="user"></param> /// <param name="itemsData"></param> /// <param name="type">0鼠标左键使用 1鼠标右键使用 2F交互</param> public virtual void Use(GameObject user, ItemsBean itemsData, ItemUseTypeEnum itemUseType) { Player player = user.GetComponent <Player>(); if (player) { //如果是F键交互 if (itemUseType == ItemUseTypeEnum.E) { UseForInteractive(player); return; } UseForPlayer(player, itemsData, itemUseType); } else { UseForOther(user, itemsData, itemUseType); } }
protected virtual void UseForPlayer(Player player, ItemsBean itemsData, ItemUseTypeEnum itemUseType) { //检测玩家前方是否有方块 if (player.playerRay.RayToChunkBlock(out RaycastHit hit, out Vector3Int targetBlockPosition)) { ChunkComponent chunkForHit = hit.collider.GetComponentInParent <ChunkComponent>(); if (chunkForHit != null) { //获取位置和方向 player.playerRay.GetHitPositionAndDirection(hit, out Vector3Int targetPosition, out Vector3Int closePosition, out BlockDirectionEnum direction); //挖掘 if (itemUseType == ItemUseTypeEnum.Left) { TargetBreak(itemsData, targetPosition); } else { TargetUse(itemsData, targetPosition); } } } }
protected override void UseForPlayer(Player player, ItemsBean itemData, ItemUseTypeEnum useType) { }
protected virtual void UseForOther(GameObject user, ItemsBean itemsData, ItemUseTypeEnum itemUseType) { }
protected override void UseForPlayer(Player player, ItemsBean itemData, ItemUseTypeEnum useType) { //检测玩家前方是否有方块 if (player.playerRay.RayToChunkBlock(out RaycastHit hit, out Vector3Int targetBlockPosition)) { ChunkComponent chunkForHit = hit.collider.GetComponentInParent <ChunkComponent>(); if (chunkForHit != null) { //获取位置和方向 player.playerRay.GetHitPositionAndDirection(hit, out Vector3Int targetPosition, out Vector3Int closePosition, out BlockDirectionEnum direction); //如果上手没有物品 或者是左键点击 则挖掘 if (itemData == null || itemData.itemId == 0 || useType == ItemUseTypeEnum.Left) { TargetBreak(itemData, targetPosition); } //如果手上有物品 则使用 else { //获取目标方块 WorldCreateHandler.Instance.manager.GetBlockForWorldPosition(targetPosition, out Block targetBlock, out BlockDirectionEnum targetBlockDirection, out Chunk taragetChunk); //首先获取靠近方块 WorldCreateHandler.Instance.manager.GetBlockForWorldPosition(closePosition, out Block closeBlock, out BlockDirectionEnum closeBlockDirection, out Chunk closeChunk); //如果靠近得方块有区块 if (closeChunk != null) { //如果不是空方块 则不放置(液体则覆盖放置) if (closeBlock != null && closeBlock.blockType != BlockTypeEnum.None && closeBlock.blockInfo.GetBlockShape() != BlockShapeEnum.Liquid) { return; } //如果重量为1 说明是草之类太轻的物体 则也不能放置 if (closeBlock != null && closeBlock.blockInfo.weight == 1) { return; } //获取物品信息 ItemsInfoBean itemsInfo = ItemsHandler.Instance.manager.GetItemsInfoById(itemData.itemId); //获取方块信息 Block useBlock = BlockHandler.Instance.manager.GetRegisterBlock(itemsInfo.type_id); BlockInfoBean blockInfo = useBlock.blockInfo; BlockTypeEnum changeBlockType = blockInfo.GetBlockType(); //获取meta数据 string metaData = useBlock.ItemUseMetaData(closePosition, changeBlockType, direction, itemData.meta); //使用方块 useBlock.ItemUse( targetPosition, targetBlockDirection, targetBlock, taragetChunk, closePosition, closeBlockDirection, closeBlock, closeChunk, direction, metaData); //扣除道具 UserDataBean userData = GameDataHandler.Instance.manager.GetUserData(); userData.AddItems(itemData, -1); //刷新UI UIHandler.Instance.RefreshUI(); } } } } }