英雄黄昏吧 关注:1,187贴子:1,964
  • 1回复贴,共1

【修改】拿走、购买、升级NPC的技能和装备【最终贴】

只看楼主收藏回复

综合贴,对之前的代码进行了优化整合
这篇文章是针对原代码的
如果上一个贴你动手修改过,可以选择卸载游戏重新安装,或者还原你备份的文件
在修改前,请备份dll文件
【小提示】
如果发现源代码报错,变量红名,点击重新加载程序集
如果添加函数后报错,双击错误信息定位错误位置,删除多余的东西
对于方法的修改一般右键编辑方法
新增方法或者属性一般右键编辑类
每次修改后要保存
类在这个{}下找,或者直接搜函数名自动跳转函数所在的类

----【流程】----
1、搜索 JudgePlayerCanDeleteNpcItem方法,判断玩家是否可以删除NPC物品,右键编辑方法
我们直接用以下代码【覆盖】,将只对亲信武将操作扩大至全武将
----------------
private bool JudgePlayerCanDeleteNpcItem(string npcID)
{
return this.m_DataModel.NpcDataDict.ContainsKey(npcID);
}
----------------
点击左上角文件,全部保存
2、找到GameManager类,右键编辑类,
【添加】以下信息
----------------
public PlayerNpcData npcData;//保存传入的npc信息
public bool isClose; //是否是亲信武将的标记
public int costGold; //保存购买价格
public int skillCombCost;//保存合成价格
public bool isNpcComb;//是否是帮NPC合成
----------------
点击左上角文件,全部保存
3、找到BagModel类,右键编辑类,【添加】以下信息
----------------
// 定义一个方法,用于获取玩家背包数据
public PlayerBagData GetPlayerBagData()
{
// 遍历背包数据列表
for (int i = 0; i <this.bagDataList.Count; i++)
{
// 获取当前遍历到的背包数据
PlayerBagData playerBagData =this.bagDataList[i];
//检查当前背包数据的玩家ID是否与当前玩家的背包ID匹配
if(playerBagData.PlayerID ==base.playerData.BagID)
{
// 如果匹配,返回当前背包数据
return playerBagData;
}
}
// 如果遍历完列表后没有找到匹配的背包数据,返回null
return null;
}
----------------
点击左上角文件,全部保存
4、在UIManager类里,搜索CloseUIPanel,将
----------------
GameManager.Instance.isNpcComb = false;
----------------
【添加】到如图位置

继续右键编辑类,将
----------------
public void CloseUIPanel_S()
{
if (!TipsUIManager.Instance.IsShowConfirmation && !GameManager.Instance.m_GeCaoModel.IsGeCaoStart)
{
if (this.bgBtnList.Count > 0)
{
Button key = this.bgBtnList[this.bgBtnList.Count - 1];
this.bgBtnDict[key]();
return;
}
if (GameManager.Instance.IsGame && !UIGame_Log.Instance.JudgeHaveActivePanel(null))
{
UIGame_Log.Instance.ClickTimePauseBtn();
}
}
}
----------------
【加入】,点击左上角文件,全部保存
5、搜索SetImageScale方法,用以下【替换】
----------------
private void SetImageScale(float scaleFactor = 1f)
{
IEnumerator enumerator = base.transform.GetEnumerator();
try
{
while (enumerator.MoveNext())
{
object obj = enumerator.Current;
Transform transform = (Transform)obj;
if (this.childScaleDict.ContainsKey(transform))
{
float num = this.childScaleDict[transform] * scaleFactor;
transform.localScale = new Vector3(num, num, num);
}
}
}
finally
{
IDisposable disposable;
if ((disposable = (enumerator as IDisposable)) != null)
{
disposable.Dispose();
}
}
}
----------------
点击左上角文件,全部保存
6、这一步在UIGame_Skill类里操作,你需要右键编辑类,
在所有信息插入完才能编译
在所有信息插入完才能编译
在所有信息插入完才能编译
(1)、【添加】CompositeButton函数,处理升段
---------------- private void CompositeButton(PlayerNpcData deleteNpcData, PlayerBagData bagData, ItemData itemData, SkillData skillData)
{
Color redColor = new Color(1f, 0f, 0f);
Color blueColor = new Color(0f, 0f, 1f);
Color blackColor = new Color(0f, 0f, 0f);
if (!(this.skillDeleteBtn.transform.Find("CompositeButton") != null))
{
this.skillDeleteBtn.onClick.RemoveAllListeners();
GameObject gameObject = UnityEngine.Object.Instantiate<GameObject>(this.skillDeleteBtn.gameObject);
gameObject.name = "CompositeButton";
gameObject.transform.SetParent(this.skillDeleteBtn.transform, false);
gameObject.transform.localPosition = new Vector2(0f, 50f);
Text text = UnityEngine.Object.Instantiate<Text>(this.skillDeleteBtn.gameObject.GetComponentsInChildren<Text>()[0]);
text.transform.SetParent(gameObject.transform, false);
text.transform.localPosition = new Vector2(0f, 50f);
text.text = "武将金钱:";
text.color = blackColor;
text.horizontalOverflow = HorizontalWrapMode.Overflow;
}
Button component = this.skillDeleteBtn.transform.Find("CompositeButton").GetComponent<Button>();
if (component != null)
{
component.gameObject.SetActive(true);
component.onClick.RemoveAllListeners();
Text[] componentsInChildren = component.GetComponentsInChildren<Text>();
if (componentsInChildren != null)
{
componentsInChildren[2].text = "武将金钱:" + deleteNpcData.Gold;
componentsInChildren[1].text = "";
if (int.Parse(itemData.ItemQuality) < 6)
{
componentsInChildren[0].text = "升段";
componentsInChildren[0].color = blackColor;
if (!GameManager.Instance.isClose)
{
componentsInChildren[1].text = "收费:" + GameManager.Instance.skillCombCost;
componentsInChildren[1].color = blueColor;
}
component.onClick.RemoveAllListeners();
component.onClick.AddListener(delegate()
{
this.ClickSkillCompBtn_S(bagData, itemData);
});
}
else
{
componentsInChildren[0].text = "无法升段";
componentsInChildren[0].color = redColor;
component.onClick.RemoveAllListeners();
component.onClick.AddListener(delegate()
{
this.ClickCloseBtn();
});
}
componentsInChildren[1].transform.localPosition = new Vector2(-150f, 0f);
}
}
}
----------------
(2)、【添加】PurchaseAndTakeAwayButton按钮,处理拿走、购买
----------------
private void PurchaseAndTakeAwayButton(PlayerNpcData deleteNpcData, SkillData skillData, CallBack deleteCallBack)
{
this.skillDeleteBtn.gameObject.SetActive(true);
this.skillDeleteBtn.onClick.RemoveAllListeners();
Text[] componentsInChildren = this.skillDeleteBtn.gameObject.GetComponentsInChildren<Text>();
Color redColor = new Color(1f, 0f, 0f);
Color blueColor = new Color(0f, 0f, 1f);
Color blackColor = new Color(0f, 0f, 0f);
if (GameManager.Instance.isClose)
{
componentsInChildren[0].text = "拿走";
componentsInChildren[1].text = null;
componentsInChildren[0].color = blackColor;
this.skillDeleteBtn.onClick.RemoveAllListeners();
this.skillDeleteBtn.onClick.AddListener(delegate()
{
this.ClickSkillDeleteBtn(deleteNpcData, skillData, deleteCallBack);
});
return;
}
componentsInChildren[1].color = blueColor;
componentsInChildren[1].transform.localPosition = new Vector2(-150f, 0f);
componentsInChildren[1].text = "价格:" + GameManager.Instance.costGold;
if (int.Parse(base.playerNpcData.Gold) < GameManager.Instance.costGold)
{
componentsInChildren[0].text = "无法购买";
componentsInChildren[0].color = redColor;
this.skillDeleteBtn.onClick.RemoveAllListeners();
this.skillDeleteBtn.onClick.AddListener(delegate()
{
this.ClickCloseBtn();
});
return;
}
componentsInChildren[0].text = "购买";
componentsInChildren[0].color = blackColor;
this.skillDeleteBtn.onClick.RemoveAllListeners();
this.skillDeleteBtn.onClick.AddListener(delegate()
{
this.ClickSkillDeleteBtn(deleteNpcData, skillData, deleteCallBack);
});
}
----------------
(3)、【添加】 ClickSkillCompBtn_S点击事件
----------------
private void ClickSkillCompBtn_S(PlayerBagData bagData, ItemData itemData)
{
SoundManager.Instance.PlayerClickSound();
if (bagData.IsLock == "0")
{
this.CloseSkillTipsPanel();
UIManager.Instance.CloseUIPanel_S();
GameManager.Instance.isNpcComb = true;
UIGame_SkillComp.Instance.ShowSkillCompPanel(itemData);
return;
}
UIGame.Instance.ShowTipsInPanel(200049, "合成", string.Empty, string.Empty, string.Empty);
}
(4)、在SetSkillTipsPanelInfo方法找到
if (deleteNpcData != null)
{
this.skillDeleteBtn.gameObject.SetActive(true);
this.skillDeleteBtn.onClick.RemoveAllListeners();
this.skillDeleteBtn.onClick.AddListener(delegate()
{
this.ClickSkillDeleteBtn(deleteNpcData, skillData, deleteCallBack);
});
}
else
{
this.skillCloseBtn.gameObject.SetActive(true);
this.skillCloseBtn.onClick.RemoveAllListeners();
this.skillCloseBtn.onClick.AddListener(new UnityAction(this.ClickCloseBtn));
}

if (deleteNpcData != null)
上方【插入】以下信息
--------------------------------
ItemData itemData = this.skillItemStaticDict[skillData.SkillID];
GameManager.Instance.npcData = npcData;
PlayerBagData playerBag = GameManager.Instance.m_BagModel.GetPlayerBagData(); if (!GameManager.Instance.m_NpcRelationModel.GetLoveNpcList(base.playerNpcData, false).Contains(npcData))//为当前武将是否是玩家亲信设置标记
{
GameManager.Instance.isClose = false;
}
else
{
GameManager.Instance.isClose = true;
}
GameManager.Instance.costGold = int.Parse(itemData.ValueGold) * 10;//售价
GameManager.Instance.skillCombCost = int.Parse(itemData.SellGold) * (int.Parse(itemData.ItemQuality) + 1) * 7;//合成要价
--------------------------------
if (deleteNpcData != null)
{
}
里的内容用以下【替换】
--------------------------------
if (deleteNpcData != null)
{
this.CompositeButton(deleteNpcData, playerBagData, itemData, skillData);
this.PurchaseAndTakeAwayButton(deleteNpcData, skillData, deleteCallBack);
}
(5)、ClickSkillDeleteBtn方法用以下【替换】
--------------------------------
private void ClickSkillDeleteBtn(PlayerNpcData npcData, SkillData skillData, CallBack deleteCallBack)
{
SoundManager.Instance.PlayerClickSound();
this.m_SkillModel.DeleteNpcSkill(npcData, skillData.SkillID, false, true);
ItemData skillItemData = this.skillItemStaticDict[skillData.SkillID];
GameManager.Instance.m_BagModel.UninstallSkill(skillItemData, true, true);
if (!GameManager.Instance.isClose)
{
GameManager.Instance.m_NpcAttrModel.AddAttr(base.playerNpcData, AttrEnum.Gold, -GameManager.Instance.costGold, false, false);
GameManager.Instance.m_NpcAttrModel.AddAttr(npcData, AttrEnum.Gold, GameManager.Instance.costGold, false, false);
}
this.CloseSkillTipsPanel(false);
deleteCallBack();
ItemData itemData = this.skillItemStaticDict[skillData.SkillID];
GameManager.Instance.m_ItemLog.DeleteItemLog(npcData, itemData, 3);
}
--------------------------------
以上,全部操作完成,点击编译
可能会报错

双击错误信息,快速定位,删除
UIGame_Skill $this = this;
$
--------------------------------
点击左上角文件,全部保存
楼下继续
最后顺便附加上英雄黄昏的物品信息表、福袋buff表
本次代码的dll替换文件和合成技能第一个位置必升段的MOD
https英雄黄昏://wwt英雄黄昏r.lan英雄黄昏zou英雄黄昏w.co执余m/b02执余1yf执余yecj执余
密码:42xw


IP属地:安徽1楼2024-09-28 18:53回复
    7、搜索ShowSkillCompPanel方法,在如图位置【添加】以下代码
    --------------------------------
    if (GameManager.Instance.isNpcComb)
    {
    this.skillCompPanelQuickCompBtn.gameObject.SetActive(false);
    }
    --------------------------------

    搜索ClickSkillCompPanelCompBtn()
    找到
    if (flag2)
    {
    }
    用以下内容【替换】
    --------------------------------
    if (flag2)
    {
    SkillData skillData2 = this.CompSkillResult(num);
    PlayerNpcData npcData = GameManager.Instance.npcData;
    ItemData itemData = DataModel.SkillItemStaticDict[skillData2.SkillID];
    if (GameManager.Instance.isNpcComb)
    {
    GameManager.Instance.m_BagModel.GiveNpcItem(npcData, itemData, 0, true);
    if (!GameManager.Instance.isClose)
    {
    int num3 = int.Parse(base.playerNpcData.Gold);
    GameManager.Instance.m_NpcAttrModel.AddAttr(base.playerNpcData, AttrEnum.Gold, GameManager.Instance.skillCombCost, false, false);
    GameManager.Instance.m_NpcAttrModel.AddAttr(npcData, AttrEnum.Gold, -GameManager.Instance.skillCombCost, false, false);
    string newLogDes = string.Concat(new object[]
    {
    "【升段】",
    base.playerNpcData.Name,
    "为",
    npcData.Name,
    "升级技能成功,金钱+",
    int.Parse(base.playerNpcData.Gold) - num3,
    "\n【升段】",
    npcData.Name,
    "金钱-",
    GameManager.Instance.skillCombCost,
    ",剩余" + npcData.Gold
    });
    UIGame_Log.Instance.CreatLogInfo(newLogDes);
    }
    }
    GameManager.Instance.npcData = null;
    for (int i = 0; i < this.skillCompPanelCloseBtnList.Count; i++)
    {
    this.skillCompPanelCloseBtnList[i].gameObject.SetActive(false);
    }
    this.SetSkillCompReusltInfo(skillData2);
    this.skillCompPanelAutoChooseBtn.gameObject.SetActive(false);
    this.skillCompPanelCompBtn.gameObject.SetActive(false);
    this.skillCompPanelOkBtn.gameObject.SetActive(true);
    this.skillCompPanelOkBtn.onClick.RemoveAllListeners();
    this.skillCompPanelOkBtn.onClick.AddListener(new UnityAction(this.ClickSkillCompPanelOkBtn));
    return;
    }
    --------------------------------
    搜索ClickSkillCompPanelOkBtn,用以下【替换】
    --------------------------------
    private void ClickSkillCompPanelOkBtn()
    {
    SoundManager.Instance.PlayerClickSound();
    if (GameManager.Instance.isNpcComb)
    {
    UIManager.Instance.CloseUIPanel_S();
    GameManager.Instance.isNpcComb = false;
    return;
    }
    this.ShowSkillCompPanel(null);
    }
    --------------------------------
    8、接下来是装备,
    在UIGame_Bag类里【添加】
    --------------------------------
    private void PurchaseAndTakeAwayButton(PlayerNpcData deleteNpcData, ItemData equipItemData, Transform tipsPanel, Transform tipsPanelParent, CallBack deleteCallBack)
    {
    this.equipTipsDeleteBtn.gameObject.SetActive(true);
    this.equipTipsDeleteBtn.onClick.RemoveAllListeners();
    Text[] componentsInChildren = this.equipTipsDeleteBtn.gameObject.GetComponentsInChildren<Text>();
    Color redColor = new Color(1f, 0f, 0f);
    Color blueColor = new Color(0f, 0f, 1f);
    Color blackColor = new Color(0f, 0f, 0f);
    if (GameManager.Instance.isClose)
    {
    componentsInChildren[0].text = "拿走";
    componentsInChildren[1].text = null;
    componentsInChildren[0].color = blackColor;
    this.equipTipsDeleteBtn.onClick.RemoveAllListeners();
    this.equipTipsDeleteBtn.onClick.AddListener(delegate()
    {
    this.ClickEquipDeleteBtn(deleteNpcData, equipItemData, this.EquipTipsPanel, this.tempEquipsParent, deleteCallBack);
    });
    return;
    }
    componentsInChildren[1].color = blueColor;
    componentsInChildren[1].transform.localPosition = new Vector2(-150f, 0f);
    componentsInChildren[1].text = "价格:" + GameManager.Instance.costGold;
    if (int.Parse(base.playerNpcData.Gold) < GameManager.Instance.costGold)
    {
    componentsInChildren[0].text = "无法购买";
    componentsInChildren[0].color = redColor;
    this.equipTipsDeleteBtn.onClick.RemoveAllListeners();
    this.equipTipsDeleteBtn.onClick.AddListener(delegate()
    {
    this.ClickCloseBtn(this.EquipTipsPanel, this.tempEquipsParent);
    });
    return;
    }
    componentsInChildren[0].text = "购买";
    componentsInChildren[0].color = blackColor;
    this.equipTipsDeleteBtn.onClick.RemoveAllListeners();
    this.equipTipsDeleteBtn.onClick.AddListener(delegate()
    {
    this.ClickEquipDeleteBtn(deleteNpcData, equipItemData, this.EquipTipsPanel, this.tempEquipsParent, deleteCallBack);
    });
    }
    --------------------------------
    搜索ShowEquipTipsPanel方法
    在里面找到
    if (deleteNpcData != null)
    {
    }
    在 if (deleteNpcData != null)的上面【添加】
    --------------------------------
    GameManager.Instance.npcData = npcData;
    if (!GameManager.Instance.m_NpcRelationModel.GetLoveNpcList(base.playerNpcData, false).Contains(npcData))
    {
    GameManager.Instance.isClose = false;
    }
    else
    {
    GameManager.Instance.isClose = true;
    }
    GameManager.Instance.costGold = int.Parse(equipItemData.ValueGold) * 10;
    --------------------------------

    if (deleteNpcData != null)
    {
    }
    的{}里面用以下【替换】
    --------------------------------
    this.PurchaseAndTakeAwayButton(deleteNpcData, equipItemData, this.EquipTipsPanel, this.tempEquipsParent, deleteCallBack);
    --------------------------------
    9、搜索ClickEquipDeleteBtn,在如图位置【添加】
    --------------------------------
    if (!GameManager.Instance.isClose)
    {
    int num = int.Parse(itemData.SellGold) * int.Parse(itemData.ItemQuality) * 10;
    GameManager.Instance.costGold = num;
    GameManager.Instance.m_NpcAttrModel.AddAttr(base.playerNpcData, AttrEnum.Gold, -num, false, false);
    GameManager.Instance.m_NpcAttrModel.AddAttr(npcData, AttrEnum.Gold, num, false, false);
    }
    GameManager.Instance.m_BagModel.UninstallEquip(itemData, true);
    --------------------------------

    10、最后,搜索AddLogDes
    用以下【替换】
    --------------------------------
    private void AddLogDes(string logDes)
    {
    if (!GameManager.Instance.m_LogModel.IsCloseLog)
    {
    if (GameManager.Instance.isClose)
    {
    logDes = logDes.Replace("移除", "拿走");
    logDes = logDes.Replace("不会进入背包中", "放进了自己的背包");
    }
    else
    {
    logDes = logDes.Replace("移除", "购买");
    string newValue = "金钱-" + GameManager.Instance.costGold.ToString();
    logDes = logDes.Replace("不会进入背包中", newValue);
    }
    UIGame_Log.Instance.CreatLogInfo(logDes);
    }
    }
    --------------------------------
    11、进入游戏测试,金钱加减不等是由于玩家获取的金钱受增益加成




    IP属地:安徽2楼2024-09-28 18:55
    回复