Merge pull request #108 from DeKaN/artisan-train
Simplify artisan training, fix Zoltan and Kanai cube reveal
This commit is contained in:
commit
c1907ea5e7
@ -73,7 +73,7 @@ namespace DiIiS_NA.Core.Logging
|
|||||||
case Logger.Level.Warn:
|
case Logger.Level.Warn:
|
||||||
return $"[darkorange3_1{postfix}]";
|
return $"[darkorange3_1{postfix}]";
|
||||||
case Logger.Level.Error:
|
case Logger.Level.Error:
|
||||||
return "[indianred1{postfix}]";
|
return $"[indianred1{postfix}]";
|
||||||
case Logger.Level.Fatal:
|
case Logger.Level.Fatal:
|
||||||
return $"[red3{postfix}]";
|
return $"[red3{postfix}]";
|
||||||
default:
|
default:
|
||||||
|
|||||||
@ -1,24 +1,19 @@
|
|||||||
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
|
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
|
||||||
using DiIiS_NA.GameServer.Core.Types.TagMap;
|
using DiIiS_NA.GameServer.Core.Types.TagMap;
|
||||||
|
using DiIiS_NA.GameServer.GSSystem.ActorSystem;
|
||||||
using DiIiS_NA.GameServer.GSSystem.ActorSystem.Interactions;
|
using DiIiS_NA.GameServer.GSSystem.ActorSystem.Interactions;
|
||||||
using DiIiS_NA.GameServer.GSSystem.MapSystem;
|
using DiIiS_NA.GameServer.GSSystem.MapSystem;
|
||||||
using DiIiS_NA.GameServer.GSSystem.PlayerSystem;
|
using DiIiS_NA.GameServer.GSSystem.PlayerSystem;
|
||||||
using DiIiS_NA.GameServer.MessageSystem;
|
using DiIiS_NA.GameServer.MessageSystem;
|
||||||
using DiIiS_NA.GameServer.MessageSystem.Message.Definitions.Misc;
|
using DiIiS_NA.GameServer.MessageSystem.Message.Definitions.Misc;
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Artisans
|
namespace DiIiS_NA.D3_GameServer.GSSystem.ActorSystem.Implementations.Artisans
|
||||||
{
|
{
|
||||||
public class Artisan : InteractiveNPC
|
public class Artisan : InteractiveNPC
|
||||||
{
|
{
|
||||||
public Artisan(World world, ActorSno sno, TagMap tags)
|
public Artisan(World world, ActorSno sno, TagMap tags)
|
||||||
: base(world, sno, tags)
|
: base(world, sno, tags)
|
||||||
{
|
{
|
||||||
Attributes[GameAttribute.MinimapActive] = true;
|
|
||||||
Interactions.Add(new CraftInteraction());
|
Interactions.Add(new CraftInteraction());
|
||||||
//Interactions.Add(new IdentifyAllInteraction());
|
//Interactions.Add(new IdentifyAllInteraction());
|
||||||
}
|
}
|
||||||
@ -26,7 +21,6 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Artisans
|
|||||||
public override void OnCraft(Player player)
|
public override void OnCraft(Player player)
|
||||||
{
|
{
|
||||||
player.InGameClient.SendMessage(new ANNDataMessage(Opcodes.OpenArtisanWindowMessage) { ActorID = DynamicID(player) });
|
player.InGameClient.SendMessage(new ANNDataMessage(Opcodes.OpenArtisanWindowMessage) { ActorID = DynamicID(player) });
|
||||||
//player.InGameClient.SendMessage(new OpenArtisanWindowMessage() { ArtisanID = this.DynamicID(player) });
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,10 +1,14 @@
|
|||||||
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
|
using DiIiS_NA.Core.Logging;
|
||||||
|
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
|
||||||
using DiIiS_NA.GameServer.Core.Types.TagMap;
|
using DiIiS_NA.GameServer.Core.Types.TagMap;
|
||||||
|
using DiIiS_NA.GameServer.GSSystem.ActorSystem;
|
||||||
|
using DiIiS_NA.GameServer.GSSystem.MapSystem;
|
||||||
using DiIiS_NA.GameServer.GSSystem.PlayerSystem;
|
using DiIiS_NA.GameServer.GSSystem.PlayerSystem;
|
||||||
using DiIiS_NA.GameServer.MessageSystem;
|
using DiIiS_NA.GameServer.MessageSystem;
|
||||||
|
using DiIiS_NA.GameServer.MessageSystem.Message.Definitions.Misc;
|
||||||
using DiIiS_NA.GameServer.MessageSystem.Message.Definitions.World;
|
using DiIiS_NA.GameServer.MessageSystem.Message.Definitions.World;
|
||||||
|
|
||||||
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Artisans
|
namespace DiIiS_NA.D3_GameServer.GSSystem.ActorSystem.Implementations.Artisans
|
||||||
{
|
{
|
||||||
[HandledSNO(
|
[HandledSNO(
|
||||||
ActorSno._pt_blacksmith_forgeweaponshortcut /* PT_Blacksmith_ForgeWeaponShortcut.acr */,
|
ActorSno._pt_blacksmith_forgeweaponshortcut /* PT_Blacksmith_ForgeWeaponShortcut.acr */,
|
||||||
@ -14,10 +18,12 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Artisans
|
|||||||
ActorSno._pt_jeweler_combineshortcut /* Actor PT_Jeweler_CombineShortcut */,
|
ActorSno._pt_jeweler_combineshortcut /* Actor PT_Jeweler_CombineShortcut */,
|
||||||
ActorSno._pt_jeweler_removegemshortcut /* Actor PT_Jeweler_RemoveGemShortcut */,
|
ActorSno._pt_jeweler_removegemshortcut /* Actor PT_Jeweler_RemoveGemShortcut */,
|
||||||
ActorSno._pt_mystic_enhanceshortcut /* Actor PT_Mystic_EnhanceShortcut */,
|
ActorSno._pt_mystic_enhanceshortcut /* Actor PT_Mystic_EnhanceShortcut */,
|
||||||
ActorSno._pt_mystic_identifyshortcut /* Actor PT_Mystic_IdentifyShortcut */
|
ActorSno._pt_mystic_identifyshortcut /* Actor PT_Mystic_IdentifyShortcut */,
|
||||||
|
ActorSno._kanaicube_stand /* Actor KanaiCube_Stand */
|
||||||
)]
|
)]
|
||||||
public class ArtisanShortcut : InteractiveNPC
|
public class ArtisanShortcut : InteractiveNPC
|
||||||
{
|
{
|
||||||
|
private static readonly Logger logger = LogManager.CreateLogger();
|
||||||
/*
|
/*
|
||||||
[437895]p4_Ruins_Frost_KanaiCube_Altar
|
[437895]p4_Ruins_Frost_KanaiCube_Altar
|
||||||
[439695] Lore_P3_ZoltunKulle_CubeHistory_01
|
[439695] Lore_P3_ZoltunKulle_CubeHistory_01
|
||||||
@ -40,7 +46,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Artisans
|
|||||||
[442282] kanai_Cube_Wash
|
[442282] kanai_Cube_Wash
|
||||||
[138979] NephalemCube
|
[138979] NephalemCube
|
||||||
//*/
|
//*/
|
||||||
public ArtisanShortcut(MapSystem.World world, ActorSno sno, TagMap tags)
|
public ArtisanShortcut(World world, ActorSno sno, TagMap tags)
|
||||||
: base(world, sno, tags)
|
: base(world, sno, tags)
|
||||||
{
|
{
|
||||||
Attributes[GameAttribute.MinimapActive] = false;
|
Attributes[GameAttribute.MinimapActive] = false;
|
||||||
@ -49,24 +55,26 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Artisans
|
|||||||
|
|
||||||
public override void OnTargeted(Player player, TargetMessage message)
|
public override void OnTargeted(Player player, TargetMessage message)
|
||||||
{
|
{
|
||||||
player.InGameClient.SendMessage(new MessageSystem.Message.Definitions.Misc.ANNDataMessage(Opcodes.OpenArtisanWindowMessage) { ActorID = DynamicID(player) });
|
player.InGameClient.SendMessage(new ANNDataMessage(Opcodes.OpenArtisanWindowMessage) { ActorID = DynamicID(player) });
|
||||||
switch (SNO)
|
player.CurrentArtisan = SNO switch
|
||||||
{
|
{
|
||||||
case ActorSno._pt_blacksmith_repairshortcut:
|
ActorSno._pt_blacksmith_repairshortcut or
|
||||||
case ActorSno._pt_blacksmith_forgeweaponshortcut:
|
ActorSno._pt_blacksmith_forgeweaponshortcut or
|
||||||
case ActorSno._pt_blacksmith_forgearmorshortcut:
|
ActorSno._pt_blacksmith_forgearmorshortcut => ArtisanType.Blacksmith,
|
||||||
player.ArtisanInteraction = "Blacksmith";
|
|
||||||
break;
|
ActorSno._pt_jeweler_combineshortcut or
|
||||||
case ActorSno._pt_jeweler_combineshortcut:
|
ActorSno._pt_jeweler_addsocketshortcut or
|
||||||
case ActorSno._pt_jeweler_addsocketshortcut:
|
ActorSno._pt_jeweler_removegemshortcut => ArtisanType.Jeweler,
|
||||||
case ActorSno._pt_jeweler_removegemshortcut:
|
|
||||||
player.ArtisanInteraction = "Jeweler";
|
ActorSno._pt_mystic_identifyshortcut or
|
||||||
break;
|
ActorSno._pt_mystic_enhanceshortcut => ArtisanType.Mystic,
|
||||||
case ActorSno._pt_mystic_identifyshortcut:
|
|
||||||
case ActorSno._pt_mystic_enhanceshortcut:
|
ActorSno._kanaicube_stand => ArtisanType.Cube,
|
||||||
player.ArtisanInteraction = "Mystic";
|
|
||||||
break;
|
_ => null,
|
||||||
}
|
};
|
||||||
|
if (player.CurrentArtisan == null)
|
||||||
|
logger.Error("Unhandled SNO {}", SNO);
|
||||||
}
|
}
|
||||||
public override bool Reveal(Player player)
|
public override bool Reveal(Player player)
|
||||||
{
|
{
|
||||||
@ -93,6 +101,9 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Artisans
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (SNO == ActorSno._kanaicube_stand && !player.KanaiUnlocked)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
|
||||||
return base.Reveal(player);
|
return base.Reveal(player);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,11 @@
|
|||||||
|
namespace DiIiS_NA.D3_GameServer.GSSystem.ActorSystem.Implementations.Artisans
|
||||||
|
{
|
||||||
|
public enum ArtisanType
|
||||||
|
{
|
||||||
|
Blacksmith,
|
||||||
|
Jeweler,
|
||||||
|
Mystic,
|
||||||
|
Nephalem,
|
||||||
|
Cube
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,16 +1,10 @@
|
|||||||
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
|
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
|
||||||
using DiIiS_NA.GameServer.Core.Types.TagMap;
|
using DiIiS_NA.GameServer.Core.Types.TagMap;
|
||||||
|
using DiIiS_NA.GameServer.GSSystem.ActorSystem;
|
||||||
using DiIiS_NA.GameServer.GSSystem.MapSystem;
|
using DiIiS_NA.GameServer.GSSystem.MapSystem;
|
||||||
using DiIiS_NA.GameServer.GSSystem.PlayerSystem;
|
using DiIiS_NA.GameServer.GSSystem.PlayerSystem;
|
||||||
using DiIiS_NA.GameServer.MessageSystem;
|
|
||||||
using DiIiS_NA.GameServer.MessageSystem.Message.Definitions.Misc;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Artisans
|
namespace DiIiS_NA.D3_GameServer.GSSystem.ActorSystem.Implementations.Artisans
|
||||||
{
|
{
|
||||||
[HandledSNO(ActorSno._pt_blacksmith /* PT_Blacksmith.acr */)]
|
[HandledSNO(ActorSno._pt_blacksmith /* PT_Blacksmith.acr */)]
|
||||||
public class Blacksmith : Artisan
|
public class Blacksmith : Artisan
|
||||||
@ -25,8 +19,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Artisans
|
|||||||
|
|
||||||
public override void OnCraft(Player player)
|
public override void OnCraft(Player player)
|
||||||
{
|
{
|
||||||
player.InGameClient.SendMessage(new ANNDataMessage(Opcodes.OpenArtisanWindowMessage) { ActorID = DynamicID(player) });
|
base.OnCraft(player);
|
||||||
player.ArtisanInteraction = "Blacksmith";
|
player.CurrentArtisan = ArtisanType.Blacksmith;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override bool Reveal(Player player)
|
public override bool Reveal(Player player)
|
||||||
|
|||||||
@ -1,12 +1,12 @@
|
|||||||
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
|
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
|
||||||
using DiIiS_NA.GameServer.Core.Types.TagMap;
|
using DiIiS_NA.GameServer.Core.Types.TagMap;
|
||||||
|
using DiIiS_NA.GameServer.GSSystem.ActorSystem;
|
||||||
using DiIiS_NA.GameServer.GSSystem.ItemsSystem;
|
using DiIiS_NA.GameServer.GSSystem.ItemsSystem;
|
||||||
using DiIiS_NA.GameServer.GSSystem.MapSystem;
|
using DiIiS_NA.GameServer.GSSystem.MapSystem;
|
||||||
using DiIiS_NA.GameServer.GSSystem.PlayerSystem;
|
using DiIiS_NA.GameServer.GSSystem.PlayerSystem;
|
||||||
using DiIiS_NA.GameServer.MessageSystem;
|
using DiIiS_NA.GameServer.MessageSystem;
|
||||||
using DiIiS_NA.GameServer.MessageSystem.Message.Definitions.Misc;
|
|
||||||
|
|
||||||
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Artisans
|
namespace DiIiS_NA.D3_GameServer.GSSystem.ActorSystem.Implementations.Artisans
|
||||||
{
|
{
|
||||||
[HandledSNO(ActorSno._pt_jeweler /* PT_Jewler.acr */)]
|
[HandledSNO(ActorSno._pt_jeweler /* PT_Jewler.acr */)]
|
||||||
public class Jeweler : Artisan
|
public class Jeweler : Artisan
|
||||||
@ -26,8 +26,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Artisans
|
|||||||
|
|
||||||
public override void OnCraft(Player player)
|
public override void OnCraft(Player player)
|
||||||
{
|
{
|
||||||
player.InGameClient.SendMessage(new ANNDataMessage(Opcodes.OpenArtisanWindowMessage) { ActorID = DynamicID(player) });
|
base.OnCraft(player);
|
||||||
player.ArtisanInteraction = "Jeweler";
|
player.CurrentArtisan = ArtisanType.Jeweler;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override bool Reveal(Player player)
|
public override bool Reveal(Player player)
|
||||||
|
|||||||
@ -1,12 +1,10 @@
|
|||||||
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
|
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
|
||||||
using DiIiS_NA.GameServer.Core.Types.TagMap;
|
using DiIiS_NA.GameServer.Core.Types.TagMap;
|
||||||
using DiIiS_NA.GameServer.GSSystem.ItemsSystem;
|
using DiIiS_NA.GameServer.GSSystem.ActorSystem;
|
||||||
using DiIiS_NA.GameServer.GSSystem.MapSystem;
|
using DiIiS_NA.GameServer.GSSystem.MapSystem;
|
||||||
using DiIiS_NA.GameServer.GSSystem.PlayerSystem;
|
using DiIiS_NA.GameServer.GSSystem.PlayerSystem;
|
||||||
using DiIiS_NA.GameServer.MessageSystem;
|
|
||||||
using DiIiS_NA.GameServer.MessageSystem.Message.Definitions.Misc;
|
|
||||||
|
|
||||||
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Artisans
|
namespace DiIiS_NA.D3_GameServer.GSSystem.ActorSystem.Implementations.Artisans
|
||||||
{
|
{
|
||||||
[HandledSNO(ActorSno._pt_mystic /* PT_Mystic.acr */)]
|
[HandledSNO(ActorSno._pt_mystic /* PT_Mystic.acr */)]
|
||||||
public class Mystic : Artisan
|
public class Mystic : Artisan
|
||||||
@ -18,8 +16,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Artisans
|
|||||||
|
|
||||||
public override void OnCraft(Player player)
|
public override void OnCraft(Player player)
|
||||||
{
|
{
|
||||||
player.InGameClient.SendMessage(new ANNDataMessage(Opcodes.OpenArtisanWindowMessage) { ActorID = DynamicID(player) });
|
base.OnCraft(player);
|
||||||
player.ArtisanInteraction = "Mystic";
|
player.CurrentArtisan = ArtisanType.Mystic;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override bool Reveal(Player player)
|
public override bool Reveal(Player player)
|
||||||
|
|||||||
@ -1,13 +1,12 @@
|
|||||||
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
|
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
|
||||||
using DiIiS_NA.GameServer.Core.Types.TagMap;
|
using DiIiS_NA.GameServer.Core.Types.TagMap;
|
||||||
using DiIiS_NA.GameServer.GSSystem.ItemsSystem;
|
using DiIiS_NA.GameServer.GSSystem.ActorSystem;
|
||||||
using DiIiS_NA.GameServer.GSSystem.MapSystem;
|
using DiIiS_NA.GameServer.GSSystem.MapSystem;
|
||||||
using DiIiS_NA.GameServer.GSSystem.PlayerSystem;
|
using DiIiS_NA.GameServer.GSSystem.PlayerSystem;
|
||||||
using DiIiS_NA.GameServer.MessageSystem;
|
using DiIiS_NA.GameServer.MessageSystem;
|
||||||
using DiIiS_NA.GameServer.MessageSystem.Message.Definitions.Misc;
|
|
||||||
using DiIiS_NA.GameServer.MessageSystem.Message.Definitions.Quest;
|
using DiIiS_NA.GameServer.MessageSystem.Message.Definitions.Quest;
|
||||||
|
|
||||||
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Artisans
|
namespace DiIiS_NA.D3_GameServer.GSSystem.ActorSystem.Implementations.Artisans
|
||||||
{
|
{
|
||||||
[HandledSNO(ActorSno._p1_lr_tieredrift_nephalem /* P1_LR_TieredRift_Nephalem.acr */)]
|
[HandledSNO(ActorSno._p1_lr_tieredrift_nephalem /* P1_LR_TieredRift_Nephalem.acr */)]
|
||||||
public class Nephalem : Artisan
|
public class Nephalem : Artisan
|
||||||
@ -15,14 +14,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Artisans
|
|||||||
public Nephalem(World world, ActorSno sno, TagMap tags)
|
public Nephalem(World world, ActorSno sno, TagMap tags)
|
||||||
: base(world, sno, tags)
|
: base(world, sno, tags)
|
||||||
{
|
{
|
||||||
Attributes[GameAttribute.NPC_Is_Operatable] = true;
|
|
||||||
Attributes[GameAttribute.Is_NPC] = true;
|
|
||||||
Attributes[GameAttribute.In_Tiered_Loot_Run_Level] = 0;
|
Attributes[GameAttribute.In_Tiered_Loot_Run_Level] = 0;
|
||||||
Attributes[GameAttribute.MinimapActive] = true;
|
|
||||||
Attributes[GameAttribute.NPC_Has_Interact_Options, 0] = true;
|
|
||||||
Attributes[GameAttribute.NPC_Has_Interact_Options, 1] = true;
|
|
||||||
Attributes[GameAttribute.NPC_Has_Interact_Options, 2] = true;
|
|
||||||
Attributes[GameAttribute.NPC_Has_Interact_Options, 3] = true;
|
|
||||||
//this.Attributes[GameAttribute.Conversation_Icon] = 2;
|
//this.Attributes[GameAttribute.Conversation_Icon] = 2;
|
||||||
//this.ForceConversationSNO =
|
//this.ForceConversationSNO =
|
||||||
}
|
}
|
||||||
@ -55,8 +47,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Artisans
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
player.InGameClient.SendMessage(new ANNDataMessage(Opcodes.OpenArtisanWindowMessage) { ActorID = DynamicID(player) });
|
base.OnCraft(player);
|
||||||
player.ArtisanInteraction = "Mystic";
|
player.CurrentArtisan = ArtisanType.Nephalem;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override bool Reveal(Player player)
|
public override bool Reveal(Player player)
|
||||||
|
|||||||
@ -1,22 +1,20 @@
|
|||||||
using DiIiS_NA.Core.Storage;
|
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
|
||||||
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
|
|
||||||
using DiIiS_NA.GameServer.Core.Types.TagMap;
|
using DiIiS_NA.GameServer.Core.Types.TagMap;
|
||||||
|
using DiIiS_NA.GameServer.GSSystem.ActorSystem;
|
||||||
using DiIiS_NA.GameServer.GSSystem.ActorSystem.Interactions;
|
using DiIiS_NA.GameServer.GSSystem.ActorSystem.Interactions;
|
||||||
|
using DiIiS_NA.GameServer.GSSystem.MapSystem;
|
||||||
using DiIiS_NA.GameServer.GSSystem.PlayerSystem;
|
using DiIiS_NA.GameServer.GSSystem.PlayerSystem;
|
||||||
using DiIiS_NA.GameServer.MessageSystem;
|
using DiIiS_NA.GameServer.MessageSystem;
|
||||||
using System;
|
using DiIiS_NA.GameServer.MessageSystem.Message.Definitions.Misc;
|
||||||
using System.Collections.Generic;
|
using DiIiS_NA.GameServer.MessageSystem.Message.Definitions.World;
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Artisans
|
namespace DiIiS_NA.D3_GameServer.GSSystem.ActorSystem.Implementations.Artisans
|
||||||
{
|
{
|
||||||
[HandledSNO(ActorSno._p2_hq_zoltunkulle)] //Zoltun
|
[HandledSNO(ActorSno._p2_hq_zoltunkulle)] //Zoltun
|
||||||
//[HandledSNO(431095)] //Wardrobe
|
//[HandledSNO(431095)] //Wardrobe
|
||||||
public class ZoltunNPC : Artisan
|
public class ZoltunNPC : Artisan
|
||||||
{
|
{
|
||||||
public ZoltunNPC(MapSystem.World world, ActorSno sno, TagMap tags)
|
public ZoltunNPC(World world, ActorSno sno, TagMap tags)
|
||||||
: base(world, sno, tags)
|
: base(world, sno, tags)
|
||||||
{
|
{
|
||||||
if (world.Game.CurrentAct == 3000)
|
if (world.Game.CurrentAct == 3000)
|
||||||
@ -30,10 +28,23 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Artisans
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void OnTargeted(Player player, MessageSystem.Message.Definitions.World.TargetMessage message)
|
public override void OnCraft(Player player)
|
||||||
{
|
{
|
||||||
base.OnTargeted(player, message);//player.InGameClient.SendMessage(new MessageSystem.Message.Definitions.Misc.ANNDataMessage(MessageSystem.Opcodes.OpenArtisanWindowMessage) { ActorID = this.DynamicID });
|
base.OnCraft(player);
|
||||||
player.ArtisanInteraction = "KanaiCube";
|
player.CurrentArtisan = ArtisanType.Cube;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void OnTargeted(Player player, TargetMessage message)
|
||||||
|
{
|
||||||
|
// TODO: check behavior for campaign mode
|
||||||
|
if (World.Game.CurrentAct == 3000 && player.KanaiUnlocked)
|
||||||
|
{
|
||||||
|
// works as ArtisanShortcut if we've found a cube. maybe only after all conversations
|
||||||
|
OnCraft(player);
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
base.OnTargeted(player, message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public override bool Reveal(Player player)
|
public override bool Reveal(Player player)
|
||||||
@ -49,21 +60,4 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Artisans
|
|||||||
return base.Reveal(player);
|
return base.Reveal(player);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[HandledSNO(ActorSno._kanaicube_stand /* Actor KanaiCube_Stand */)]
|
|
||||||
public class CubeShortcut : InteractiveNPC
|
|
||||||
{
|
|
||||||
public CubeShortcut(MapSystem.World world, ActorSno sno, TagMap tags)
|
|
||||||
: base(world, sno, tags)
|
|
||||||
{
|
|
||||||
Attributes[GameAttribute.MinimapActive] = true;
|
|
||||||
Attributes[GameAttribute.Conversation_Icon, 0] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void OnTargeted(Player player, MessageSystem.Message.Definitions.World.TargetMessage message)
|
|
||||||
{
|
|
||||||
player.InGameClient.SendMessage(new MessageSystem.Message.Definitions.Misc.ANNDataMessage(Opcodes.OpenArtisanWindowMessage) { ActorID = DynamicID(player) });
|
|
||||||
player.ArtisanInteraction = "Cube";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -48,8 +48,12 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
|
|||||||
var Cube = World.GetActorBySNO(ActorSno._p4_ruins_frost_kanaicube_altar);
|
var Cube = World.GetActorBySNO(ActorSno._p4_ruins_frost_kanaicube_altar);
|
||||||
Cube.PlayActionAnimation(AnimationSno.p4_ruins_frost_kanaicube_altar_active);
|
Cube.PlayActionAnimation(AnimationSno.p4_ruins_frost_kanaicube_altar_active);
|
||||||
//{[Actor] [Type: Gizmo] SNOId:437895 GlobalId: 1017303610 Position: x:331.9304 y:867.761 z:5.41071 Name: p4_Ruins_Frost_KanaiCube_Altar}
|
//{[Actor] [Type: Gizmo] SNOId:437895 GlobalId: 1017303610 Position: x:331.9304 y:867.761 z:5.41071 Name: p4_Ruins_Frost_KanaiCube_Altar}
|
||||||
|
// TODO: check all players OR all players at current map
|
||||||
foreach (var plr in player.InGameClient.Game.Players.Values)
|
foreach (var plr in player.InGameClient.Game.Players.Values)
|
||||||
|
{
|
||||||
plr.GrantCriteria(74987252674266);
|
plr.GrantCriteria(74987252674266);
|
||||||
|
plr.KanaiUnlocked = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -935,7 +935,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
Logger.Trace("Learning recipe...");
|
Logger.Trace("Learning recipe...");
|
||||||
for (var i = 0; i < 10; i++)
|
for (var i = 0; i < 10; i++)
|
||||||
if (ItemDefinition.RecipeToGrant[i] != -1)
|
if (ItemDefinition.RecipeToGrant[i] != -1)
|
||||||
player.LearnRecipe(player.ArtisanInteraction, ItemDefinition.RecipeToGrant[i]);
|
player.LearnRecipe(player.CurrentArtisan, ItemDefinition.RecipeToGrant[i]);
|
||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
@ -0,0 +1,93 @@
|
|||||||
|
using DiIiS_NA.Core.Storage.AccountDataBase.Entities;
|
||||||
|
using DiIiS_NA.D3_GameServer.GSSystem.ActorSystem.Implementations.Artisans;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
namespace DiIiS_NA.D3_GameServer.GSSystem.PlayerSystem
|
||||||
|
{
|
||||||
|
internal class ArtisanTrainHelper
|
||||||
|
{
|
||||||
|
private const int maxLevel = 12;
|
||||||
|
private static readonly ArtisanType[] canBeTrained = new[] { ArtisanType.Blacksmith, ArtisanType.Jeweler, ArtisanType.Mystic };
|
||||||
|
private static readonly Dictionary<ArtisanType, string> recipeTemplates = new()
|
||||||
|
{
|
||||||
|
[ArtisanType.Blacksmith] = "BlackSmith_Train_Level{0}",
|
||||||
|
[ArtisanType.Jeweler] = "Jeweler_Train_Level{0}",
|
||||||
|
[ArtisanType.Mystic] = "Mystic_Train_Level{0}"
|
||||||
|
};
|
||||||
|
private static readonly Dictionary<ArtisanType, long[]> achievements = new()
|
||||||
|
{
|
||||||
|
[ArtisanType.Blacksmith] = new[] { 74987243307767, 74987243307768, 74987243307769, 74987251817289 },
|
||||||
|
[ArtisanType.Jeweler] = new[] { 74987243307781, 74987243307782, 74987243307783, 74987257153995 },
|
||||||
|
[ArtisanType.Mystic] = new[] { 74987253584575, 74987256660015, 74987248802163, 74987251397159 }
|
||||||
|
};
|
||||||
|
private static readonly Dictionary<ArtisanType, long> criteriaForLevel10 = new()
|
||||||
|
{
|
||||||
|
[ArtisanType.Blacksmith] = 74987249071497,
|
||||||
|
[ArtisanType.Jeweler] = 74987245845978,
|
||||||
|
[ArtisanType.Mystic] = 74987259424359
|
||||||
|
};
|
||||||
|
private static readonly int[] animationTags = new[] {
|
||||||
|
0x00011500,
|
||||||
|
0x00011510,
|
||||||
|
0x00011520,
|
||||||
|
0x00011530,
|
||||||
|
0x00011540,
|
||||||
|
0x00011550,
|
||||||
|
0x00011560,
|
||||||
|
0x00011570,
|
||||||
|
0x00011580,
|
||||||
|
0x00011590,
|
||||||
|
// fixme no animation
|
||||||
|
0x00011600,
|
||||||
|
// fixme no animation
|
||||||
|
0x00011610,
|
||||||
|
};
|
||||||
|
private static readonly int[] idleAnimationTags = new[] {
|
||||||
|
0x00011210,
|
||||||
|
0x00011220,
|
||||||
|
0x00011230,
|
||||||
|
0x00011240,
|
||||||
|
0x00011250,
|
||||||
|
0x00011260,
|
||||||
|
0x00011270,
|
||||||
|
0x00011280,
|
||||||
|
0x00011290,
|
||||||
|
0x00011300,
|
||||||
|
// fixme no animation
|
||||||
|
0x00011310,
|
||||||
|
// fixme no animation
|
||||||
|
0x00011320
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
private readonly ArtisanType artisanType;
|
||||||
|
internal ArtisanTrainHelper(DBCraft dBCraft, ArtisanType type)
|
||||||
|
{
|
||||||
|
if (!canBeTrained.Contains(type))
|
||||||
|
throw new ArgumentException("Unsupported artisan type", nameof(type));
|
||||||
|
DbRef = dBCraft ?? throw new ArgumentNullException(nameof(dBCraft));
|
||||||
|
artisanType = type;
|
||||||
|
}
|
||||||
|
internal DBCraft DbRef { get; }
|
||||||
|
|
||||||
|
internal string TrainRecipeName => string.Format(recipeTemplates[artisanType], Math.Min(DbRef.Level, maxLevel - 1));
|
||||||
|
|
||||||
|
internal bool HasMaxLevel => DbRef.Level >= maxLevel;
|
||||||
|
|
||||||
|
internal ulong? Achievement => DbRef.Level switch
|
||||||
|
{
|
||||||
|
// index by level: 2 -> 0, 5 -> 1, 10 -> 2, 12 -> 3
|
||||||
|
2 or 5 or 10 or 12 => (ulong)achievements[artisanType][DbRef.Level / 4],
|
||||||
|
_ => null,
|
||||||
|
};
|
||||||
|
|
||||||
|
internal ulong? Criteria => DbRef.Level == 10 ? (ulong)criteriaForLevel10[artisanType] : null;
|
||||||
|
|
||||||
|
internal int AnimationTag => animationTags[DbRef.Level - 1];
|
||||||
|
internal int IdleAnimationTag => idleAnimationTags[DbRef.Level - 1];
|
||||||
|
|
||||||
|
internal int Type => Array.IndexOf(canBeTrained, artisanType);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -22,7 +22,6 @@ using DiIiS_NA.GameServer.MessageSystem.Message.Definitions.Effect;
|
|||||||
using DiIiS_NA.GameServer.ClientSystem;
|
using DiIiS_NA.GameServer.ClientSystem;
|
||||||
using DiIiS_NA.GameServer.MessageSystem.Message.Definitions.Base;
|
using DiIiS_NA.GameServer.MessageSystem.Message.Definitions.Base;
|
||||||
using static DiIiS_NA.Core.MPQ.FileFormats.GameBalance;
|
using static DiIiS_NA.Core.MPQ.FileFormats.GameBalance;
|
||||||
using DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Artisans;
|
|
||||||
using DiIiS_NA.Core.Extensions;
|
using DiIiS_NA.Core.Extensions;
|
||||||
|
|
||||||
namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
|
namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
|
||||||
|
|||||||
@ -118,6 +118,9 @@ using DiIiS_NA.GameServer.MessageSystem.Message.Definitions.Encounter;
|
|||||||
//Blizzless Project 2022
|
//Blizzless Project 2022
|
||||||
using DiIiS_NA.GameServer.MessageSystem.Message.Definitions.UI;
|
using DiIiS_NA.GameServer.MessageSystem.Message.Definitions.UI;
|
||||||
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
|
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
|
||||||
|
using DiIiS_NA.D3_GameServer.GSSystem.ActorSystem.Implementations.Artisans;
|
||||||
|
using DiIiS_NA.D3_GameServer.GSSystem.PlayerSystem;
|
||||||
|
using NHibernate.Util;
|
||||||
|
|
||||||
namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
|
namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
|
||||||
{
|
{
|
||||||
@ -143,7 +146,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Current crafting NPC type(for learning recipes)
|
/// Current crafting NPC type(for learning recipes)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string ArtisanInteraction = "None";
|
public ArtisanType? CurrentArtisan { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The player's toon.
|
/// The player's toon.
|
||||||
@ -374,22 +377,20 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
|
|||||||
|
|
||||||
var achievements = InGameClient.Game.GameDBSession.SessionQueryWhere<DBAchievements>(dba => dba.DBGameAccount.Id == Toon.GameAccount.PersistentID);
|
var achievements = InGameClient.Game.GameDBSession.SessionQueryWhere<DBAchievements>(dba => dba.DBGameAccount.Id == Toon.GameAccount.PersistentID);
|
||||||
|
|
||||||
BlacksmithUnlocked = achievements.Where(dba => dba.AchievementId == 74987243307766).Count() > 0;
|
BlacksmithUnlocked = achievements.Any(dba => dba.AchievementId == 74987243307766);
|
||||||
JewelerUnlocked = achievements.Where(dba => dba.AchievementId == 74987243307780).Count() > 0;
|
JewelerUnlocked = achievements.Any(dba => dba.AchievementId == 74987243307780);
|
||||||
MysticUnlocked = achievements.Where(dba => dba.AchievementId == 74987247205955).Count() > 0;
|
MysticUnlocked = achievements.Any(dba => dba.AchievementId == 74987247205955);
|
||||||
|
|
||||||
KanaiUnlocked = false;
|
KanaiUnlocked = achievements.Where(dba => dba.AchievementId == 74987254626662)
|
||||||
foreach (var achi in achievements.Where(dba => dba.AchievementId == 74987254626662).ToList())
|
.SelectMany(x => AchievementSystem.AchievementManager.UnserializeBytes(x.Criteria))
|
||||||
foreach (var crit in AchievementSystem.AchievementManager.UnserializeBytes(achi.Criteria))
|
.Any(x => x == unchecked((uint)74987252674266));
|
||||||
if (crit == unchecked((uint)74987252674266))
|
|
||||||
KanaiUnlocked = true;
|
|
||||||
|
|
||||||
if (Level >= 70)
|
if (Level >= 70)
|
||||||
GrantCriteria(74987254853541);
|
GrantCriteria(74987254853541);
|
||||||
|
|
||||||
HirelingTemplarUnlocked = achievements.Where(dba => dba.AchievementId == 74987243307073).Count() > 0;
|
HirelingTemplarUnlocked = achievements.Any(dba => dba.AchievementId == 74987243307073);
|
||||||
HirelingScoundrelUnlocked = achievements.Where(dba => dba.AchievementId == 74987243307147).Count() > 0;
|
HirelingScoundrelUnlocked = achievements.Any(dba => dba.AchievementId == 74987243307147);
|
||||||
HirelingEnchantressUnlocked = achievements.Where(dba => dba.AchievementId == 74987243307145).Count() > 0;
|
HirelingEnchantressUnlocked = achievements.Any(dba => dba.AchievementId == 74987243307145);
|
||||||
SkillSet = new SkillSet(this, Toon.Class, Toon);
|
SkillSet = new SkillSet(this, Toon.Class, Toon);
|
||||||
GroundItems = new Dictionary<uint, Item>();
|
GroundItems = new Dictionary<uint, Item>();
|
||||||
Followers = new Dictionary<uint, ActorSno>();
|
Followers = new Dictionary<uint, ActorSno>();
|
||||||
@ -1527,7 +1528,6 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
|
|||||||
}
|
}
|
||||||
public void AcceptBossEncounter()
|
public void AcceptBossEncounter()
|
||||||
{
|
{
|
||||||
ArtisanInteraction = "QueueAccepted";
|
|
||||||
InGameClient.Game.AcceptBossEncounter();
|
InGameClient.Game.AcceptBossEncounter();
|
||||||
}
|
}
|
||||||
public void DeclineBossEncounter()
|
public void DeclineBossEncounter()
|
||||||
@ -2700,213 +2700,56 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
|
|||||||
|
|
||||||
private void OnArtisanWindowClosed()
|
private void OnArtisanWindowClosed()
|
||||||
{
|
{
|
||||||
|
CurrentArtisan = null;
|
||||||
}
|
}
|
||||||
//*
|
//*
|
||||||
private void TrainArtisan(GameClient client, RequestTrainArtisanMessage message)
|
private void TrainArtisan(GameClient client, RequestTrainArtisanMessage message)
|
||||||
{
|
{
|
||||||
int AnimByLevel = 0;
|
if (CurrentArtisan == null || !artisanTrainHelpers.ContainsKey(CurrentArtisan.Value)) {
|
||||||
int IdleByLevel = 0;
|
Logger.Warn("Training for artisan {} is not supported", CurrentArtisan);
|
||||||
|
return;
|
||||||
if (ArtisanInteraction == "Blacksmith")
|
|
||||||
{
|
|
||||||
if (blacksmith_data.Level > 55) return;
|
|
||||||
var recipeDefinition = ItemGenerator.GetRecipeDefinition(string.Format("BlackSmith_Train_Level{0}", Math.Min(blacksmith_data.Level, 55)));
|
|
||||||
|
|
||||||
//Logger.Trace(string.Format("BlackSmith_Train_Level{0}", Math.Min(blacksmith_data.Level, 45)));
|
|
||||||
if (Inventory.GetGoldAmount() < recipeDefinition.Gold) return;
|
|
||||||
bool haveEnoughIngredients = true;
|
|
||||||
|
|
||||||
foreach (var ingr in recipeDefinition.Ingredients) //first loop (checking)
|
|
||||||
{
|
|
||||||
if (ingr.ItemsGBID == -1) continue;
|
|
||||||
if (!Inventory.HaveEnough(ingr.ItemsGBID, ingr.Count)) { haveEnoughIngredients = false; break; } //if havent enough then exit
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!haveEnoughIngredients) return;
|
|
||||||
Inventory.RemoveGoldAmount(recipeDefinition.Gold);
|
|
||||||
|
|
||||||
foreach (var ingr in recipeDefinition.Ingredients) //second loop (getting)
|
|
||||||
{
|
|
||||||
if (ingr.ItemsGBID == -1) continue;
|
|
||||||
Inventory.GrabSomeItems(ingr.ItemsGBID, ingr.Count);
|
|
||||||
}
|
|
||||||
|
|
||||||
blacksmith_data.Level++;
|
|
||||||
World.Game.GameDBSession.SessionUpdate(blacksmith_data);
|
|
||||||
if (blacksmith_data.Level == 2)
|
|
||||||
GrantAchievement(74987243307767);
|
|
||||||
if (blacksmith_data.Level == 5)
|
|
||||||
GrantAchievement(74987243307768);
|
|
||||||
if (blacksmith_data.Level == 10)
|
|
||||||
{
|
|
||||||
GrantAchievement(74987243307769);
|
|
||||||
GrantCriteria(74987249071497);
|
|
||||||
}
|
|
||||||
if (blacksmith_data.Level == 12)
|
|
||||||
{
|
|
||||||
GrantAchievement(74987251817289);
|
|
||||||
//74987249993545
|
|
||||||
if (jeweler_data.Level == 12 && mystic_data.Level == 12)
|
|
||||||
{
|
|
||||||
GrantCriteria(74987249993545);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (blacksmith_data.Level)
|
|
||||||
{
|
|
||||||
case 1: AnimByLevel = 0x00011500; IdleByLevel = 0x00011210; break;
|
|
||||||
case 2: AnimByLevel = 0x00011510; IdleByLevel = 0x00011220; break;
|
|
||||||
case 3: AnimByLevel = 0x00011520; IdleByLevel = 0x00011230; break;
|
|
||||||
case 4: AnimByLevel = 0x00011530; IdleByLevel = 0x00011240; break;
|
|
||||||
case 5: AnimByLevel = 0x00011540; IdleByLevel = 0x00011250; break;
|
|
||||||
case 6: AnimByLevel = 0x00011550; IdleByLevel = 0x00011260; break;
|
|
||||||
case 7: AnimByLevel = 0x00011560; IdleByLevel = 0x00011270; break;
|
|
||||||
case 8: AnimByLevel = 0x00011570; IdleByLevel = 0x00011280; break;
|
|
||||||
case 9: AnimByLevel = 0x00011580; IdleByLevel = 0x00011290; break;
|
|
||||||
case 10: AnimByLevel = 0x00011590; IdleByLevel = 0x00011300; break;
|
|
||||||
case 11: AnimByLevel = 0x00011600; IdleByLevel = 0x00011310; break;
|
|
||||||
case 12: AnimByLevel = 0x00011610; IdleByLevel = 0x00011320; break;
|
|
||||||
}
|
|
||||||
client.SendMessage(new CrafterLevelUpMessage
|
|
||||||
{
|
|
||||||
Type = 0,
|
|
||||||
AnimTag = AnimByLevel,
|
|
||||||
NewIdle = IdleByLevel,
|
|
||||||
Level = blacksmith_data.Level
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
}
|
||||||
if (ArtisanInteraction == "Jeweler")
|
|
||||||
|
var trainHelper = artisanTrainHelpers[CurrentArtisan.Value];
|
||||||
|
if (trainHelper.HasMaxLevel)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var recipeDefinition = ItemGenerator.GetRecipeDefinition(trainHelper.TrainRecipeName);
|
||||||
|
if (Inventory.GetGoldAmount() < recipeDefinition.Gold)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var requiredIngridients = recipeDefinition.Ingredients.Where(x => x.ItemsGBID > 0);
|
||||||
|
// FIXME: Inventory.HaveEnough doesn't work for some craft consumables
|
||||||
|
var haveEnoughIngredients = requiredIngridients.All(x => Inventory.HaveEnough(x.ItemsGBID, x.Count));
|
||||||
|
if (!haveEnoughIngredients)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Inventory.RemoveGoldAmount(recipeDefinition.Gold);
|
||||||
|
foreach (var ingr in requiredIngridients)
|
||||||
{
|
{
|
||||||
if (jeweler_data.Level > 12) return;
|
// FIXME: Inventory.GrabSomeItems doesn't work for some craft consumables
|
||||||
var recipeDefinition = ItemGenerator.GetRecipeDefinition(string.Format("Jeweler_Train_Level{0}", Math.Min(jeweler_data.Level, 11)));
|
Inventory.GrabSomeItems(ingr.ItemsGBID, ingr.Count);
|
||||||
|
}
|
||||||
|
|
||||||
if (Inventory.GetGoldAmount() < recipeDefinition.Gold) return;
|
trainHelper.DbRef.Level++;
|
||||||
bool haveEnoughIngredients = true;
|
World.Game.GameDBSession.SessionUpdate(trainHelper.DbRef);
|
||||||
|
|
||||||
foreach (var ingr in recipeDefinition.Ingredients) //first loop (checking)
|
if (trainHelper.Achievement is not null)
|
||||||
{
|
GrantAchievement(trainHelper.Achievement.Value);
|
||||||
if (ingr.ItemsGBID == -1) continue;
|
if (trainHelper.Criteria is not null)
|
||||||
if (!Inventory.HaveEnough(ingr.ItemsGBID, ingr.Count)) { haveEnoughIngredients = false; break; } //if havent enough then exit
|
GrantCriteria(trainHelper.Criteria.Value);
|
||||||
}
|
|
||||||
|
|
||||||
if (!haveEnoughIngredients) return;
|
if (artisanTrainHelpers.All(x => x.Value.HasMaxLevel))
|
||||||
Inventory.RemoveGoldAmount(recipeDefinition.Gold);
|
GrantCriteria(74987249993545);
|
||||||
|
|
||||||
foreach (var ingr in recipeDefinition.Ingredients) //second loop (getting)
|
client.SendMessage(new CrafterLevelUpMessage
|
||||||
{
|
{
|
||||||
if (ingr.ItemsGBID == -1) continue;
|
Type = trainHelper.Type,
|
||||||
Inventory.GrabSomeItems(ingr.ItemsGBID, ingr.Count);
|
AnimTag = trainHelper.AnimationTag,
|
||||||
}
|
NewIdle = trainHelper.IdleAnimationTag,
|
||||||
|
Level = trainHelper.DbRef.Level
|
||||||
|
});
|
||||||
|
|
||||||
jeweler_data.Level++;
|
|
||||||
World.Game.GameDBSession.SessionUpdate(jeweler_data);
|
|
||||||
if (jeweler_data.Level == 2)
|
|
||||||
GrantAchievement(74987243307781);
|
|
||||||
if (jeweler_data.Level == 5)
|
|
||||||
GrantAchievement(74987243307782);
|
|
||||||
if (jeweler_data.Level == 10)
|
|
||||||
{
|
|
||||||
GrantAchievement(74987243307783);
|
|
||||||
GrantCriteria(74987245845978);
|
|
||||||
}
|
|
||||||
if (jeweler_data.Level == 12)
|
|
||||||
{
|
|
||||||
GrantAchievement(74987257153995);
|
|
||||||
if (blacksmith_data.Level == 12 && mystic_data.Level == 12)
|
|
||||||
{
|
|
||||||
GrantCriteria(74987249993545);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
switch (jeweler_data.Level)
|
|
||||||
{
|
|
||||||
case 1: AnimByLevel = 0x00011500; IdleByLevel = 0x00011210; break;
|
|
||||||
case 2: AnimByLevel = 0x00011510; IdleByLevel = 0x00011220; break;
|
|
||||||
case 3: AnimByLevel = 0x00011520; IdleByLevel = 0x00011230; break;
|
|
||||||
case 4: AnimByLevel = 0x00011530; IdleByLevel = 0x00011240; break;
|
|
||||||
case 5: AnimByLevel = 0x00011540; IdleByLevel = 0x00011250; break;
|
|
||||||
case 6: AnimByLevel = 0x00011550; IdleByLevel = 0x00011260; break;
|
|
||||||
case 7: AnimByLevel = 0x00011560; IdleByLevel = 0x00011270; break;
|
|
||||||
case 8: AnimByLevel = 0x00011570; IdleByLevel = 0x00011280; break;
|
|
||||||
case 9: AnimByLevel = 0x00011580; IdleByLevel = 0x00011290; break;
|
|
||||||
case 10: AnimByLevel = 0x00011590; IdleByLevel = 0x00011300; break;
|
|
||||||
case 11: AnimByLevel = 0x00011600; IdleByLevel = 0x00011310; break;
|
|
||||||
case 12: AnimByLevel = 0x00011610; IdleByLevel = 0x00011320; break;
|
|
||||||
}
|
|
||||||
client.SendMessage(new CrafterLevelUpMessage
|
|
||||||
{
|
|
||||||
Type = 1,
|
|
||||||
AnimTag = AnimByLevel,
|
|
||||||
NewIdle = IdleByLevel,
|
|
||||||
Level = jeweler_data.Level
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (ArtisanInteraction == "Mystic")
|
|
||||||
{
|
|
||||||
if (mystic_data.Level > 12) return;
|
|
||||||
var recipeDefinition = ItemGenerator.GetRecipeDefinition(string.Format("Mystic_Train_Level{0}", Math.Min(mystic_data.Level, 11)));
|
|
||||||
|
|
||||||
if (Inventory.GetGoldAmount() < recipeDefinition.Gold) return;
|
|
||||||
bool haveEnoughIngredients = true;
|
|
||||||
|
|
||||||
foreach (var ingr in recipeDefinition.Ingredients) //first loop (checking)
|
|
||||||
{
|
|
||||||
if (ingr.ItemsGBID == -1) continue;
|
|
||||||
if (!Inventory.HaveEnough(ingr.ItemsGBID, ingr.Count)) { haveEnoughIngredients = false; break; } //if havent enough then exit
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!haveEnoughIngredients) return;
|
|
||||||
Inventory.RemoveGoldAmount(recipeDefinition.Gold);
|
|
||||||
|
|
||||||
foreach (var ingr in recipeDefinition.Ingredients) //second loop (getting)
|
|
||||||
{
|
|
||||||
if (ingr.ItemsGBID == -1) continue;
|
|
||||||
Inventory.GrabSomeItems(ingr.ItemsGBID, ingr.Count);
|
|
||||||
}
|
|
||||||
|
|
||||||
mystic_data.Level++;
|
|
||||||
World.Game.GameDBSession.SessionUpdate(mystic_data);
|
|
||||||
if (mystic_data.Level == 2)
|
|
||||||
GrantAchievement(74987253584575);
|
|
||||||
if (mystic_data.Level == 5)
|
|
||||||
GrantAchievement(74987256660015);
|
|
||||||
if (mystic_data.Level == 10)
|
|
||||||
{
|
|
||||||
GrantAchievement(74987248802163);
|
|
||||||
GrantCriteria(74987259424359);
|
|
||||||
}
|
|
||||||
if (mystic_data.Level == 12)
|
|
||||||
{
|
|
||||||
//this.GrantAchievement(74987256206128);
|
|
||||||
if (jeweler_data.Level == 12 && blacksmith_data.Level == 12)
|
|
||||||
{
|
|
||||||
GrantCriteria(74987249993545);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
switch (mystic_data.Level)
|
|
||||||
{
|
|
||||||
case 1: AnimByLevel = 0x00011500; IdleByLevel = 0x00011210; break;
|
|
||||||
case 2: AnimByLevel = 0x00011510; IdleByLevel = 0x00011220; break;
|
|
||||||
case 3: AnimByLevel = 0x00011520; IdleByLevel = 0x00011230; break;
|
|
||||||
case 4: AnimByLevel = 0x00011530; IdleByLevel = 0x00011240; break;
|
|
||||||
case 5: AnimByLevel = 0x00011540; IdleByLevel = 0x00011250; break;
|
|
||||||
case 6: AnimByLevel = 0x00011550; IdleByLevel = 0x00011260; break;
|
|
||||||
case 7: AnimByLevel = 0x00011560; IdleByLevel = 0x00011270; break;
|
|
||||||
case 8: AnimByLevel = 0x00011570; IdleByLevel = 0x00011280; break;
|
|
||||||
case 9: AnimByLevel = 0x00011580; IdleByLevel = 0x00011290; break;
|
|
||||||
case 10: AnimByLevel = 0x00011590; IdleByLevel = 0x00011300; break;
|
|
||||||
case 11: AnimByLevel = 0x00011600; IdleByLevel = 0x00011310; break;
|
|
||||||
case 12: AnimByLevel = 0x00011610; IdleByLevel = 0x00011320; break;
|
|
||||||
}
|
|
||||||
client.SendMessage(new CrafterLevelUpMessage
|
|
||||||
{
|
|
||||||
Type = 2,
|
|
||||||
AnimTag = AnimByLevel,
|
|
||||||
NewIdle = IdleByLevel,
|
|
||||||
Level = mystic_data.Level
|
|
||||||
});
|
|
||||||
}
|
|
||||||
LoadCrafterData();
|
LoadCrafterData();
|
||||||
|
|
||||||
|
|
||||||
@ -4273,7 +4116,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
|
|||||||
return data.SelectMany(BitConverter.GetBytes).ToArray();
|
return data.SelectMany(BitConverter.GetBytes).ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void LearnRecipe(string artisan, int recipe)
|
public void LearnRecipe(ArtisanType? artisan, int recipe)
|
||||||
{
|
{
|
||||||
Logger.Trace("Learning recipe #{0}, Artisan type: {1}", recipe, artisan);
|
Logger.Trace("Learning recipe #{0}, Artisan type: {1}", recipe, artisan);
|
||||||
/*var query = this.World.Game.GameDBSession.SessionQuerySingle<DBCraft>(
|
/*var query = this.World.Game.GameDBSession.SessionQuerySingle<DBCraft>(
|
||||||
@ -4281,14 +4124,14 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
|
|||||||
dbi.DBGameAccount.Id == this.Toon.GameAccount.PersistentID &&
|
dbi.DBGameAccount.Id == this.Toon.GameAccount.PersistentID &&
|
||||||
dbi.Artisan == artisan &&
|
dbi.Artisan == artisan &&
|
||||||
dbi.isHardcore == this.World.Game.IsHardcore);*/
|
dbi.isHardcore == this.World.Game.IsHardcore);*/
|
||||||
if (artisan == "Blacksmith")
|
if (artisan == ArtisanType.Blacksmith)
|
||||||
{
|
{
|
||||||
learnedBlacksmithRecipes.Add(recipe);
|
learnedBlacksmithRecipes.Add(recipe);
|
||||||
blacksmith_data.LearnedRecipes = SerializeBytes(learnedBlacksmithRecipes);
|
blacksmith_data.LearnedRecipes = SerializeBytes(learnedBlacksmithRecipes);
|
||||||
World.Game.GameDBSession.SessionUpdate(blacksmith_data);
|
World.Game.GameDBSession.SessionUpdate(blacksmith_data);
|
||||||
UpdateAchievementCounter(404, 1, 0);
|
UpdateAchievementCounter(404, 1, 0);
|
||||||
}
|
}
|
||||||
if (artisan == "Jeweler")
|
else if (artisan == ArtisanType.Jeweler)
|
||||||
{
|
{
|
||||||
learnedJewelerRecipes.Add(recipe);
|
learnedJewelerRecipes.Add(recipe);
|
||||||
jeweler_data.LearnedRecipes = SerializeBytes(learnedJewelerRecipes);
|
jeweler_data.LearnedRecipes = SerializeBytes(learnedJewelerRecipes);
|
||||||
@ -4322,6 +4165,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
|
|||||||
private DBCraft blacksmith_data = null;
|
private DBCraft blacksmith_data = null;
|
||||||
private DBCraft jeweler_data = null;
|
private DBCraft jeweler_data = null;
|
||||||
private DBCraft mystic_data = null;
|
private DBCraft mystic_data = null;
|
||||||
|
private Dictionary<ArtisanType, ArtisanTrainHelper> artisanTrainHelpers = new();
|
||||||
|
|
||||||
public void LoadCrafterData()
|
public void LoadCrafterData()
|
||||||
{
|
{
|
||||||
@ -4332,6 +4176,10 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
|
|||||||
blacksmith_data = craft_data.Single(dbc => dbc.Artisan == "Blacksmith" && dbc.isHardcore == World.Game.IsHardcore && dbc.isSeasoned == World.Game.IsSeasoned);
|
blacksmith_data = craft_data.Single(dbc => dbc.Artisan == "Blacksmith" && dbc.isHardcore == World.Game.IsHardcore && dbc.isSeasoned == World.Game.IsSeasoned);
|
||||||
jeweler_data = craft_data.Single(dbc => dbc.Artisan == "Jeweler" && dbc.isHardcore == World.Game.IsHardcore && dbc.isSeasoned == World.Game.IsSeasoned);
|
jeweler_data = craft_data.Single(dbc => dbc.Artisan == "Jeweler" && dbc.isHardcore == World.Game.IsHardcore && dbc.isSeasoned == World.Game.IsSeasoned);
|
||||||
mystic_data = craft_data.Single(dbc => dbc.Artisan == "Mystic" && dbc.isHardcore == World.Game.IsHardcore && dbc.isSeasoned == World.Game.IsSeasoned);
|
mystic_data = craft_data.Single(dbc => dbc.Artisan == "Mystic" && dbc.isHardcore == World.Game.IsHardcore && dbc.isSeasoned == World.Game.IsSeasoned);
|
||||||
|
|
||||||
|
artisanTrainHelpers[ArtisanType.Blacksmith] = new ArtisanTrainHelper(blacksmith_data, ArtisanType.Blacksmith);
|
||||||
|
artisanTrainHelpers[ArtisanType.Jeweler] = new ArtisanTrainHelper(jeweler_data, ArtisanType.Jeweler);
|
||||||
|
artisanTrainHelpers[ArtisanType.Mystic] = new ArtisanTrainHelper(mystic_data, ArtisanType.Mystic);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
//Blizzless Project 2022
|
//Blizzless Project 2022
|
||||||
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
|
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
|
||||||
using DiIiS_NA.D3_GameServer.GSSystem.ActorSystem.Implementations.Minions;
|
using DiIiS_NA.D3_GameServer.GSSystem.ActorSystem.Implementations.Minions;
|
||||||
using DiIiS_NA.GameServer.Core.Types.Math;
|
using DiIiS_NA.GameServer.Core.Types.Math;
|
||||||
@ -2338,7 +2338,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Implementations
|
|||||||
else
|
else
|
||||||
StartCooldown(60f);
|
StartCooldown(60f);
|
||||||
|
|
||||||
List<Actor> ancients = new List<Actor>();
|
var ancients = new List<AncientBarbarian>();
|
||||||
for (int i = 0; i < 3; i++)
|
for (int i = 0; i < 3; i++)
|
||||||
{
|
{
|
||||||
var ancient = SpawnAncient(i);
|
var ancient = SpawnAncient(i);
|
||||||
@ -2352,9 +2352,9 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Implementations
|
|||||||
}
|
}
|
||||||
yield return WaitSeconds(0.8f);
|
yield return WaitSeconds(0.8f);
|
||||||
|
|
||||||
foreach (Actor ancient in ancients)
|
foreach (var ancient in ancients)
|
||||||
{
|
{
|
||||||
(ancient as Minion).Brain.Activate();
|
ancient.Brain.Activate();
|
||||||
ancient.Attributes[GameAttribute.Untargetable] = false;
|
ancient.Attributes[GameAttribute.Untargetable] = false;
|
||||||
ancient.Attributes.BroadcastChangedIfRevealed();
|
ancient.Attributes.BroadcastChangedIfRevealed();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2122,7 +2122,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Implementations
|
|||||||
yield return WaitSeconds(0.2f);
|
yield return WaitSeconds(0.2f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (Rune_E > 0)
|
else if (Rune_E > 0)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < ScriptFormula(13); i++)
|
for (int i = 0; i < ScriptFormula(13); i++)
|
||||||
{
|
{
|
||||||
@ -2133,13 +2133,13 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Implementations
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
yield return WaitSeconds(0.5f);
|
yield return WaitSeconds(0.5f);
|
||||||
foreach (var Fetish in fetishes)
|
foreach (var fetish in fetishes)
|
||||||
{
|
{
|
||||||
Fetish.MakeFetishLive(customLifeTime: null);
|
fetish.MakeFetishLive(customLifeTime: null);
|
||||||
if (Rune_A > 0)
|
if (Rune_A > 0)
|
||||||
{
|
{
|
||||||
Fetish.PlayEffectGroup(133761);
|
fetish.PlayEffectGroup(133761);
|
||||||
WeaponDamage(GetEnemiesInRadius(Fetish.Position, 5f), ScriptFormula(5), DamageType.Physical);
|
WeaponDamage(GetEnemiesInRadius(fetish.Position, 5f), ScriptFormula(5), DamageType.Physical);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,12 +1,10 @@
|
|||||||
//Blizzless Project 2022
|
//Blizzless Project 2022
|
||||||
using System;
|
using System;
|
||||||
//Blizzless Project 2022
|
//Blizzless Project 2022
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
//Blizzless Project 2022
|
//Blizzless Project 2022
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
//Blizzless Project 2022
|
//Blizzless Project 2022
|
||||||
using System.Text;
|
|
||||||
//Blizzless Project 2022
|
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
//Blizzless Project 2022
|
//Blizzless Project 2022
|
||||||
using DiIiS_NA.Core.Logging;
|
using DiIiS_NA.Core.Logging;
|
||||||
@ -248,7 +246,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads
|
|||||||
//Темные жрецы
|
//Темные жрецы
|
||||||
case ActorSno._triunevessel_event31:
|
case ActorSno._triunevessel_event31:
|
||||||
//Падшие
|
//Падшие
|
||||||
case ActorSno._fallengrunt_a:
|
case ActorSno._fallengrunt_a:
|
||||||
Target.PlayAnimation(11, AnimationSno.triunesummoner_death_02_persistentblood, 1f);
|
Target.PlayAnimation(11, AnimationSno.triunesummoner_death_02_persistentblood, 1f);
|
||||||
break;
|
break;
|
||||||
//Разнощик чумы
|
//Разнощик чумы
|
||||||
@ -259,7 +257,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads
|
|||||||
Target.PlayAnimation(11, AnimationSno.fleshpitflyer_death, 1f);
|
Target.PlayAnimation(11, AnimationSno.fleshpitflyer_death, 1f);
|
||||||
break;
|
break;
|
||||||
//X1_LR_Boss_Angel_Corrupt_A
|
//X1_LR_Boss_Angel_Corrupt_A
|
||||||
case ActorSno._x1_lr_boss_angel_corrupt_a:
|
case ActorSno._x1_lr_boss_angel_corrupt_a:
|
||||||
Target.PlayAnimation(11, AnimationSno.angel_corrupt_death_01, 1f);
|
Target.PlayAnimation(11, AnimationSno.angel_corrupt_death_01, 1f);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|||||||
@ -17,7 +17,6 @@ namespace DiIiS_NA.GameServer.MessageSystem.Message.Definitions.Encounter
|
|||||||
|
|
||||||
public void Handle(GameClient client)
|
public void Handle(GameClient client)
|
||||||
{
|
{
|
||||||
client.Player.ArtisanInteraction = "QueueAccepted";
|
|
||||||
client.Game.AcceptBossEncounter();
|
client.Game.AcceptBossEncounter();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
user.block.title