Merge pull request #210 from rgto/community

Fix community Branch and Materials stash
This commit is contained in:
Enthusiast 2025-09-29 10:52:01 -03:00 committed by GitHub
commit 6aedabb165
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
14 changed files with 248 additions and 110 deletions

View File

@ -64,6 +64,16 @@ dotnet publish ./src/DiIiS-NA/Blizzless.csproj --configuration Release --output
- `!account add username@ YourPassword YourBattleTag owner` - `!account add username@ YourPassword YourBattleTag owner`
- Creates an account with Login `username@`, password `YourPassword` and BattleTag `YourBattleTag` with rank `owner` - Creates an account with Login `username@`, password `YourPassword` and BattleTag `YourBattleTag` with rank `owner`
### Example:
> !account add username@ YourPassword YourBattleTag
Creates an account with Login `username@`, password `YourPassword` and BattleTag `YourBattleTag`
> !account add username@ YourPassword YourBattleTag owner
Creates an account with Login `username@`, password `YourPassword` and BattleTag `YourBattleTag` with rank `owner`
## Prepare Client ## Prepare Client
Do this for each client connecting to the server. Do this for each client connecting to the server.

View File

@ -72,7 +72,7 @@ namespace DiIiS_NA.GameServer.GSSystem.QuestSystem.QuestEvents.Implementations
var spawner = world.GetActorBySNO(ActorSno._trdun_rescuecainskelspawner); var spawner = world.GetActorBySNO(ActorSno._trdun_rescuecainskelspawner);
while (spawner != null) while (spawner != null)
{ {
var monster = FastRandom.Instance.Next(10) % 2 == 0 ? ActorSno._skeletonking_shield_skeleton : ActorSno._skeletonking_skeleton; var monster = ActorSno._skeletonking_shield_skeleton;
world.SpawnMonster(monster, spawner.Position); world.SpawnMonster(monster, spawner.Position);
spawner.Destroy(); spawner.Destroy();
spawner = world.GetActorBySNO(ActorSno._trdun_rescuecainskelspawner); spawner = world.GetActorBySNO(ActorSno._trdun_rescuecainskelspawner);

View File

@ -77,7 +77,7 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services
const int anniversaryEventStatus = 1; const int anniversaryEventStatus = 1;
const int challengeRiftNumber = 1; const int challengeRiftNumber = 1;
const bool freeToPlay = true; const bool freeToPlay = true;
const bool storeStatus = false; // false const bool storeStatus = true; // false (true - disabled, false - enabled)
const string catalogDigest = "C42DC6117A7008EDA2006542D6C07EAD096DAD90"; const string catalogDigest = "C42DC6117A7008EDA2006542D6C07EAD096DAD90";
const string catalogVersion = "633565800390338000"; const string catalogVersion = "633565800390338000";
const int regionId = 1; const int regionId = 1;
@ -92,8 +92,8 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services
$" OnlineService.Store.Status={(storeStatus ? "1" : "0")}" + //Store Status, 0 - Enabled, 1 - Disabled $" OnlineService.Store.Status={(storeStatus ? "1" : "0")}" + //Store Status, 0 - Enabled, 1 - Disabled
$" OnlineService.Store.ProductCatalogDigest={catalogDigest}" + //China $" OnlineService.Store.ProductCatalogDigest={catalogDigest}" + //China
$" OnlineService.Store.ProductCatalogVersion={catalogVersion}" + //Chinese Catalog $" OnlineService.Store.ProductCatalogVersion={catalogVersion}" + //Chinese Catalog
//" OnlineService.Store.ProductCatalogDigest=79162283AFACCBA5DA989BD341F7B782860AC1F4" + //Euro //" OnlineService.Store.ProductCatalogDigest=79162283AFACCBA5DA989BD341F7B782860AC1F4" + //Euro
//" OnlineService.Store.ProductCatalogVersion=635984100169931000" + //Euro //" OnlineService.Store.ProductCatalogVersion=635984100169931000" + //Euro
$" OnlineService.Region.Id={regionId}"); //Region $" OnlineService.Region.Id={regionId}"); //Region
Init.SetSeenTutorials(ByteString.CopyFrom(Client.Account.GameAccount.DBGameAccount.SeenTutorials)); Init.SetSeenTutorials(ByteString.CopyFrom(Client.Account.GameAccount.DBGameAccount.SeenTutorials));

View File

@ -1,5 +1,4 @@
using System; using System;
using System.Collections.Generic;
using System.Linq; using System.Linq;
using DiIiS_NA.Core.MPQ; using DiIiS_NA.Core.MPQ;
@ -19043,8 +19042,39 @@ namespace DiIiS_NA.D3_GameServer.Core.Types.SNO
_p74_dh_multishotrune_discipline_cast_proj_actor = 487919, _p74_dh_multishotrune_discipline_cast_proj_actor = 487919,
_p74_dh_multishotrune_width_cast_proj_actor = 487920, _p74_dh_multishotrune_width_cast_proj_actor = 487920,
_p74_cosmetic_pet_zombiewolfpup = 487966, _p74_cosmetic_pet_zombiewolfpup = 487966,
#endregion _holidaygift = 488101,
} _p75_cos_pet_murlocinarius = 488105,
_p75_displayicon = 488117,
_p75_cos_pet_inariusmurloc_wings = 488119,
_p75_displayicon_024 = 488129,
_p75_displayicon_002 = 488130,
_p75_displayicon_004 = 488131,
_p75_displayicon_023 = 488132,
_p75_cosmetic_pet_inariusmurloc = 488138,
_p75_cos_wings_inarius = 488139,
_p75_cos_wings_inarius_barbf = 488186,
_p75_cos_wings_inarius_barbm = 488189,
_p75_cos_wings_inarius_cdrf = 488191,
_p75_cos_wings_inarius_cdrm = 488193,
_p75_cos_wings_inarius_dhf = 488195,
_p75_cos_wings_inarius_dhm = 488197,
_p75_cos_wings_inarius_monkf = 488199,
_p75_cos_wings_inarius_monkm = 488201,
_p75_cos_wings_inarius_nmf = 488203,
_p75_cos_wings_inarius_nmm = 488205,
_p75_cos_wings_inarius_wdf = 488207,
_p75_cos_wings_inarius_wdm = 488209,
_p75_cos_wings_inarius_wizf = 488211,
_p75_cos_wings_inarius_wizm = 488213,
_p75_darkalchemy_gizmo_altar = 488275,
_p75_cos_pet_angelicdragon = 488485,
_p75_cosmetic_pet_angelicdragon = 488498,
_p75_displayicon_018 = 488500,
_p75_displayicon_020 = 488501,
_p75_crafting_primal = 488515,
_p75_itempassive_unique_ring_017_dome_purple_red = 488528,
#endregion
}
static class ActorSnoExtensions static class ActorSnoExtensions
{ {

View File

@ -15253,6 +15253,9 @@
p75_cos_wings_inarius_anim_wizf_idle_2_intimidate = 488182, p75_cos_wings_inarius_anim_wizf_idle_2_intimidate = 488182,
p75_cos_wings_inarius_anim_wizm_idle_0_neutral = 488183, p75_cos_wings_inarius_anim_wizm_idle_0_neutral = 488183,
p75_cos_wings_inarius_anim_wizm_idle_2_intimidate = 488185, p75_cos_wings_inarius_anim_wizm_idle_2_intimidate = 488185,
p75_cos_pet_angelicdragon_creation = 488486,
p75_cos_pet_angelicdragon_fidget_grp = 488487,
p75_cos_pet_angelicdragon_run = 488488,
#endregion #endregion
} }
} }

View File

@ -61,7 +61,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
return; return;
} }
int cost = item.ItemDefinition.Cost; int cost = item.ItemDefinition.CostAlt;
//Check shards here //Check shards here
if (currentShards < cost) if (currentShards < cost)
return; return;

View File

@ -25,7 +25,7 @@ namespace DiIiS_NA.GameServer.GSSystem.GameSystem
var thread = new GameUpdateThread(); var thread = new GameUpdateThread();
//thread.CPUAffinity = (1UL << coreId); //thread.CPUAffinity = (1UL << coreId);
_updateWorkers.Add(thread); _updateWorkers.Add(thread);
var loopThread = new Thread(thread.Run) { Name = "UpdateWorkerThread", IsBackground = true }; ; // create the game update thread. var loopThread = new Thread(thread.Run) { Name = "UpdateWorkerThread", IsBackground = true };
loopThread.Start(); loopThread.Start();
} }
Logger.Info("Started {0} threads", CPUCount); Logger.Info("Started {0} threads", CPUCount);

View File

@ -46,7 +46,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
set set
{ {
Attributes[GameAttributes.Unidentified] = value; Attributes[GameAttributes.Unidentified] = value;
if (DBInventory is {} dbInventory) dbInventory.Unidentified = value; if (DBInventory is { } dbInventory) dbInventory.Unidentified = value;
} }
} }
@ -832,14 +832,88 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
public override void OnTargeted(Player player, TargetMessage message) public override void OnTargeted(Player player, TargetMessage message)
{ {
player.Inventory.RefreshInventoryToClient(); player.Inventory.RefreshInventoryToClient();
var playerAcc = player.InGameClient.BnetClient.Account.GameAccount; var playerAcc = player.InGameClient.BnetClient.Account.GameAccount;
switch (SNO) switch (SNO)
{ {
case ActorSno._tieredlootrunkey_0: case ActorSno._tieredlootrunkey_0: //Greater Rift Key
playerAcc.BigPortalKey++; playerAcc.BigPortalKey++;
Destroy(); Destroy();
break; break;
case ActorSno._crafting_assortedparts_05: //Reusable Parts
playerAcc.CraftItem1++;
Destroy();
break;
case ActorSno._crafting_magic_05: //Arcanes Dust
playerAcc.CraftItem2++;
Destroy();
break;
case ActorSno._crafting_rare_05: //Veiled Crystal
playerAcc.CraftItem3++;
Destroy();
break;
case ActorSno._crafting_looted_reagent_05: //Death's Breath
playerAcc.CraftItem4++;
Destroy();
break;
case ActorSno._crafting_legendary_05: //Forgotten Soul
playerAcc.CraftItem5++;
Destroy();
break;
case ActorSno._craftingreagent_legendary_set_borns_x1: //Khanduran Rune Bounty itens Act I.
playerAcc.HoradricA1Res++;
Destroy();
break;
case ActorSno._craftingreagent_legendary_set_cains_x1: //Caldeum Nightshade Bounty itens Act II.
playerAcc.HoradricA2Res++;
Destroy();
break;
case ActorSno._craftingreagent_legendary_set_demon_x1: //Arreat War Tapestry Bounty itens Act III.
playerAcc.HoradricA3Res++;
Destroy();
break;
case ActorSno._craftingreagent_legendary_set_hallowed_x1: //Corrupted Angel Flesh Bounty itens Act IV.
playerAcc.HoradricA4Res++;
Destroy();
break;
case ActorSno._craftingreagent_legendary_set_captaincrimsons_x1: //Westmarch Holy Water Bounty itens Act V.
playerAcc.HoradricA5Res++;
Destroy();
break;
case ActorSno._demonorgan_skeletonking_x1: //Leorik Regret.
playerAcc.LeorikKey++;
Destroy();
break;
case ActorSno._demonorgan_ghom_x1: //Vial of Putridness.
playerAcc.VialofPutridness++;
Destroy();
break;
case ActorSno._demonorgan_siegebreaker_x1: //Idol of Terror.
playerAcc.IdolofTerror++;
Destroy();
break;
case ActorSno._demonorgan_diablo_x1: //Heart of Fright.
playerAcc.HeartofFright++;
Destroy();
break;
//case ActorSno._currency_platinum_flippy: //Platinum coin
// playerAcc.Platinum++;
// Destroy();
// break;
default: default:
player.Inventory.PickUp(this); player.Inventory.PickUp(this);
break; break;
@ -902,7 +976,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
player.InGameClient.SendMessage( player.InGameClient.SendMessage(
new MessageSystem.Message.Definitions.Base.GenericBlobMessage(Opcodes.CurrencyDataFull) new MessageSystem.Message.Definitions.Base.GenericBlobMessage(Opcodes.CurrencyDataFull)
{ Data = Moneys.Build().ToByteArray() }); { Data = Moneys.Build().ToByteArray() });
} }
public virtual void OnRequestUse(Player player, Item target, int actionId, WorldPlace worldPlace) public virtual void OnRequestUse(Player player, Item target, int actionId, WorldPlace worldPlace)
@ -1195,7 +1269,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
player.InGameClient.SendMessage( player.InGameClient.SendMessage(
new MessageSystem.Message.Definitions.Base.GenericBlobMessage(Opcodes.CurrencyDataFull) new MessageSystem.Message.Definitions.Base.GenericBlobMessage(Opcodes.CurrencyDataFull)
{ Data = moneys.Build().ToByteArray() }); { Data = moneys.Build().ToByteArray() });
player.Inventory.DestroyInventoryItem(this); player.Inventory.DestroyInventoryItem(this);
return; return;

View File

@ -582,7 +582,8 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
ChangeItemLocationDB(old_x, old_y + 1, addedItem); ChangeItemLocationDB(old_x, old_y + 1, addedItem);
destGrid.PlaceItem(addedItem, old_y + 1, old_x); destGrid.PlaceItem(addedItem, old_y + 1, old_x);
} }
}; }
;
} }
else else
{ {
@ -1198,12 +1199,12 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
(a.OverrideLevelReq <= Item.ItemDefinition.RequiredLevel) (a.OverrideLevelReq <= Item.ItemDefinition.RequiredLevel)
); );
if (!ReloadAffix.Definition.Name.Contains("Secondary")) filteredList = filteredList.Where( a => !a.Name.Contains("Secondary") ); if (!ReloadAffix.Definition.Name.Contains("Secondary")) filteredList = filteredList.Where(a => !a.Name.Contains("Secondary"));
if (!ReloadAffix.Definition.Name.Contains("Experience")) filteredList = filteredList.Where(a => !a.Name.Contains("Experience")); if (!ReloadAffix.Definition.Name.Contains("Experience")) filteredList = filteredList.Where(a => !a.Name.Contains("Experience"));
if (!ReloadAffix.Definition.Name.Contains("Archon")) filteredList = filteredList.Where(a => !a.Name.Contains("Archon")); if (!ReloadAffix.Definition.Name.Contains("Archon")) filteredList = filteredList.Where(a => !a.Name.Contains("Archon"));
// FIXME: always true? // FIXME: always true?
if (ReloadAffix.Definition.Hash == ReloadAffix.Definition.Hash) filteredList = filteredList.Where(a => a.Hash != ReloadAffix.Definition.Hash); if (ReloadAffix.Definition.Hash == ReloadAffix.Definition.Hash) filteredList = filteredList.Where(a => a.Hash != ReloadAffix.Definition.Hash);
if (Item.GBHandle.GBID == -4139386) filteredList = filteredList.Where( a => !a.Name.Contains("Str") && !a.Name.Contains("Dex") && !a.Name.Contains("Int") && !a.Name.Contains("Vit" )); if (Item.GBHandle.GBID == -4139386) filteredList = filteredList.Where(a => !a.Name.Contains("Str") && !a.Name.Contains("Dex") && !a.Name.Contains("Int") && !a.Name.Contains("Vit"));
Dictionary<int, AffixTable> bestDefinitions = new Dictionary<int, AffixTable>(); Dictionary<int, AffixTable> bestDefinitions = new Dictionary<int, AffixTable>();
@ -1557,7 +1558,8 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
return; return;
int idDuration = 60; int idDuration = 60;
_owner.StartCasting(idDuration, new Action(() => { _owner.StartCasting(idDuration, new Action(() =>
{
item.Identify(); item.Identify();
})); }));
} }
@ -1713,7 +1715,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
switch (ingr.ItemsGBID) switch (ingr.ItemsGBID)
{ {
case -363607620: // Common parts. case -363607620: // Common parts.
if(_owner.Toon.GameAccount.CraftItem1 < ingr.Count) if (_owner.Toon.GameAccount.CraftItem1 < ingr.Count)
haveEnoughIngredients = false; haveEnoughIngredients = false;
break; break;
case -1585802162: // Wizard Dust. case -1585802162: // Wizard Dust.
@ -1754,7 +1756,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
_stashGrid.RemoveItem(item); _stashGrid.RemoveItem(item);
item.Unreveal(item.Owner as Player); item.Unreveal(item.Owner as Player);
} }
else if(item.Attributes[GameAttributes.ItemStackQuantityLo] > ingr.Count) else if (item.Attributes[GameAttributes.ItemStackQuantityLo] > ingr.Count)
{ {
item.Attributes[GameAttributes.ItemStackQuantityLo] -= ingr.Count; item.Attributes[GameAttributes.ItemStackQuantityLo] -= ingr.Count;
item.Attributes.BroadcastChangedIfRevealed(); item.Attributes.BroadcastChangedIfRevealed();
@ -1773,13 +1775,13 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
switch (ingr.ItemsGBID) switch (ingr.ItemsGBID)
{ {
case -363607620: // Common parts. case -363607620: // Common parts.
_owner.Toon.GameAccount.CraftItem1 -= ingr.Count; _owner.Toon.GameAccount.CraftItem1 -= ingr.Count;
break; break;
case -1585802162: // Wizard Dust. case -1585802162: // Wizard Dust.
_owner.Toon.GameAccount.CraftItem2 -= ingr.Count; _owner.Toon.GameAccount.CraftItem2 -= ingr.Count;
break; break;
case -605947593: // Blurred Crystal. case -605947593: // Blurred Crystal.
_owner.Toon.GameAccount.CraftItem3 -= ingr.Count; _owner.Toon.GameAccount.CraftItem3 -= ingr.Count;
break; break;
} }
} }
@ -1800,7 +1802,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
} }
//else //else
if (!(recipeDefinition.Name.StartsWith("T12_") || recipeDefinition.Name.StartsWith("T11_"))) if (!(recipeDefinition.Name.StartsWith("T12_") || recipeDefinition.Name.StartsWith("T11_")))
reward.Attributes[GameAttributes.Item_Quality_Level] = Math.Min(recipe.ItemSpecifierData.AdditionalRandomAffixes + 2 , 9); reward.Attributes[GameAttributes.Item_Quality_Level] = Math.Min(recipe.ItemSpecifierData.AdditionalRandomAffixes + 2, 9);
if (reward.Attributes[GameAttributes.Item_Quality_Level] < 9) if (reward.Attributes[GameAttributes.Item_Quality_Level] < 9)
{ {
AffixGenerator.Generate(reward, recipe.ItemSpecifierData.AdditionalRandomAffixes, true); AffixGenerator.Generate(reward, recipe.ItemSpecifierData.AdditionalRandomAffixes, true);
@ -2318,7 +2320,12 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
D3.Items.CurrencyData craft7Data = D3.Items.CurrencyData.CreateBuilder().SetId(20).SetCount(playerAcc.BigPortalKey).Build(); // KeyStone Greater Rift. D3.Items.CurrencyData craft7Data = D3.Items.CurrencyData.CreateBuilder().SetId(20).SetCount(playerAcc.BigPortalKey).Build(); // KeyStone Greater Rift.
D3.Items.CurrencyData[] consumables = {goldData, bloodShardData, platinumData, craft1Data, craft2Data, craft3Data, craft4Data, craft5Data, craft7Data, horadric1Data, horadric2Data, horadric3Data, horadric4Data, horadric5Data, craft8Data, craft9Data, craft10Data, craft11Data}; D3.Items.CurrencyData[] consumables = {
goldData, bloodShardData, platinumData, craft1Data,
craft2Data, craft3Data, craft4Data, craft5Data, craft7Data,
horadric1Data, horadric2Data, horadric3Data, horadric4Data,
horadric5Data, craft8Data, craft9Data, craft10Data, craft11Data
};
foreach (var consumable in consumables) foreach (var consumable in consumables)
{ {
@ -2404,7 +2411,8 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
_owner.SetAttributesByParagon(); _owner.SetAttributesByParagon();
CheckWeapons(); CheckWeapons();
_owner.Attributes.BroadcastChangedIfRevealed(); _owner.Attributes.BroadcastChangedIfRevealed();
Task.Delay(3000).ContinueWith((t) => { Task.Delay(3000).ContinueWith((t) =>
{
try try
{ {
_owner.CheckBonusSets(); _owner.CheckBonusSets();

View File

@ -2148,7 +2148,7 @@ public class Player : Actor, IMessageConsumer, IUpdateable
break; break;
#endregion #endregion
} }
} }
@ -3215,7 +3215,7 @@ public class Player : Actor, IMessageConsumer, IUpdateable
}); });
World.Leave(skeleton); World.Leave(skeleton);
} }
catch{} catch { }
} }
NecromancerSkeletons.Clear(); NecromancerSkeletons.Clear();
@ -4013,9 +4013,9 @@ public class Player : Actor, IMessageConsumer, IUpdateable
{ {
var baseStrength = 0.0f; var baseStrength = 0.0f;
var multiplier = StrengthMultiplier; var multiplier = StrengthMultiplier;
baseStrength = Toon.HeroTable.CoreAttribute == GameBalance.PrimaryAttribute.Strength baseStrength = Toon.HeroTable.CoreAttribute == GameBalance.PrimaryAttribute.Strength
? Toon.HeroTable.Strength + (Level - 1) * 3 ? Toon.HeroTable.Strength + (Level - 1) * 3
: Toon.HeroTable.Strength + (Level - 1); : Toon.HeroTable.Strength + (Level - 1);
return baseStrength * multiplier; return baseStrength * multiplier;
} }
@ -4098,7 +4098,9 @@ public class Player : Actor, IMessageConsumer, IUpdateable
HotBarButtons = SkillSet.HotBarSkills, HotBarButtons = SkillSet.HotBarSkills,
HotBarButton = new HotbarButtonData HotBarButton = new HotbarButtonData
{ {
SNOSkill = -1, RuneType = -1, ItemGBId = SNOSkill = -1,
RuneType = -1,
ItemGBId =
StringHashHelper.HashItemName( StringHashHelper.HashItemName(
"HealthPotionBottomless") //2142362846//this.Toon.DBActiveSkills.PotionGBID "HealthPotionBottomless") //2142362846//this.Toon.DBActiveSkills.PotionGBID
, ,
@ -4340,8 +4342,14 @@ public class Player : Actor, IMessageConsumer, IUpdateable
//returns empty data //returns empty data
var emptyHireling = new HirelingInfo var emptyHireling = new HirelingInfo
{ {
HirelingIndex = type, GbidName = 0x0000, Dead = false, Skill1SNOId = -1, Skill2SNOId = -1, HirelingIndex = type,
Skill3SNOId = -1, Skill4SNOId = -1, annItems = -1 GbidName = 0x0000,
Dead = false,
Skill1SNOId = -1,
Skill2SNOId = -1,
Skill3SNOId = -1,
Skill4SNOId = -1,
annItems = -1
}; };
return emptyHireling; return emptyHireling;
} }
@ -4499,18 +4507,18 @@ public class Player : Actor, IMessageConsumer, IUpdateable
if (BlacksmithUnlocked || InGameClient.Game.CurrentAct == 3000) if (BlacksmithUnlocked || InGameClient.Game.CurrentAct == 3000)
InGameClient.SendMessage(new GenericBlobMessage(Opcodes.CraftingDataBlacksmithInitialMessage) InGameClient.SendMessage(new GenericBlobMessage(Opcodes.CraftingDataBlacksmithInitialMessage)
{ Data = blacksmith.ToByteArray() }); { Data = blacksmith.ToByteArray() });
if (JewelerUnlocked || InGameClient.Game.CurrentAct == 3000) if (JewelerUnlocked || InGameClient.Game.CurrentAct == 3000)
InGameClient.SendMessage(new GenericBlobMessage(Opcodes.CraftingDataJewelerInitialMessage) InGameClient.SendMessage(new GenericBlobMessage(Opcodes.CraftingDataJewelerInitialMessage)
{ Data = jeweler.ToByteArray() }); { Data = jeweler.ToByteArray() });
if (MysticUnlocked || InGameClient.Game.CurrentAct == 3000) if (MysticUnlocked || InGameClient.Game.CurrentAct == 3000)
{ {
InGameClient.SendMessage(new GenericBlobMessage(Opcodes.CraftingDataMysticInitialMessage) InGameClient.SendMessage(new GenericBlobMessage(Opcodes.CraftingDataMysticInitialMessage)
{ Data = mystic.ToByteArray() }); { Data = mystic.ToByteArray() });
InGameClient.SendMessage(new GenericBlobMessage(Opcodes.CraftingDataTransmogInitialMessage) InGameClient.SendMessage(new GenericBlobMessage(Opcodes.CraftingDataTransmogInitialMessage)
{ Data = transmog.ToByteArray() }); { Data = transmog.ToByteArray() });
} }
} }
@ -4609,7 +4617,7 @@ public class Player : Actor, IMessageConsumer, IUpdateable
private readonly Dictionary<ulong, uint> _achievementCounters = new(); private readonly Dictionary<ulong, uint> _achievementCounters = new();
public int DodgesInARow { get; set; } = 0; public int DodgesInARow { get; set; } = 0;
public int BlocksInARow { get; set; }= 0; public int BlocksInARow { get; set; } = 0;
public void GrantAchievement(ulong id) public void GrantAchievement(ulong id)
{ {
@ -5114,13 +5122,15 @@ public class Player : Actor, IMessageConsumer, IUpdateable
if (World.Game.IsHardcore && Attributes[GameAttributes.Level] >= 70) if (World.Game.IsHardcore && Attributes[GameAttributes.Level] >= 70)
addedExp *= 5; addedExp *= 5;
if (Attributes[GameAttributes.Alt_Level] >= 515) // To'do verify this formula.
{ // Remove this if to remove paragon level cap.
var XPcap = 91.262575239831f * Math.Pow(Attributes[GameAttributes.Alt_Level], 3) - //if (Attributes[GameAttributes.Alt_Level] >= 515)
44301.083380565047f * Math.Pow(Attributes[GameAttributes.Alt_Level], 2) + //{
3829010.395566940308f * Attributes[GameAttributes.Alt_Level] + 322795582.543823242188f; // var XPcap = 91.262575239831f * Math.Pow(Attributes[GameAttributes.Alt_Level], 3) -
addedExp = (int)((float)(ParagonLevelBorders[Attributes[GameAttributes.Alt_Level]] / XPcap) * addedExp); // 44301.083380565047f * Math.Pow(Attributes[GameAttributes.Alt_Level], 2) +
} // 3829010.395566940308f * Attributes[GameAttributes.Alt_Level] + 322795582.543823242188f;
// addedExp = (int)((float)(ParagonLevelBorders[Attributes[GameAttributes.Alt_Level]] / XPcap) * addedExp);
//}
if (Attributes[GameAttributes.Rest_Experience_Lo] > 0) if (Attributes[GameAttributes.Rest_Experience_Lo] > 0)
{ {
@ -5585,9 +5595,9 @@ public class Player : Actor, IMessageConsumer, IUpdateable
}); });
plr.InGameClient.SendMessage(new DisplayGameTextMessage(Opcodes.DisplayGameChatTextMessage) plr.InGameClient.SendMessage(new DisplayGameTextMessage(Opcodes.DisplayGameChatTextMessage)
{ Message = "Messages:LR_BossSpawned" }); { Message = "Messages:LR_BossSpawned" });
plr.InGameClient.SendMessage(new DisplayGameTextMessage(Opcodes.DisplayGameTextMessage) plr.InGameClient.SendMessage(new DisplayGameTextMessage(Opcodes.DisplayGameTextMessage)
{ Message = "Messages:LR_BossSpawned" }); { Message = "Messages:LR_BossSpawned" });
} }
StartConversation(World, 366542); StartConversation(World, 366542);
@ -5687,40 +5697,40 @@ public class Player : Actor, IMessageConsumer, IUpdateable
case 0: case 0:
return; return;
case > 0: case > 0:
{
if (Attributes[GameAttributes.Hitpoints_Cur] < Attributes[GameAttributes.Hitpoints_Max_Total])
{ {
if (Toon.Class == ToonClass.Barbarian) if (Attributes[GameAttributes.Hitpoints_Cur] < Attributes[GameAttributes.Hitpoints_Max_Total])
if (SkillSet.HasPassive(205217))
quantity += 0.01f * Attributes[GameAttributes.Health_Globe_Bonus_Health];
if (guidingLight) //Monk -> Guiding Light
{ {
var missingHP = if (Toon.Class == ToonClass.Barbarian)
(Attributes[GameAttributes.Hitpoints_Max_Total] - Attributes[GameAttributes.Hitpoints_Cur]) / if (SkillSet.HasPassive(205217))
Attributes[GameAttributes.Hitpoints_Max_Total]; quantity += 0.01f * Attributes[GameAttributes.Health_Globe_Bonus_Health];
if (missingHP > 0.05f)
if (!World.BuffManager.HasBuff<GuidingLightBuff>(this)) if (guidingLight) //Monk -> Guiding Light
World.BuffManager.AddBuff(this, this, {
new GuidingLightBuff(Math.Min(missingHP, 0.3f), var missingHP =
TickTimer.WaitSeconds(World.Game, 10.0f))); (Attributes[GameAttributes.Hitpoints_Max_Total] - Attributes[GameAttributes.Hitpoints_Cur]) /
Attributes[GameAttributes.Hitpoints_Max_Total];
if (missingHP > 0.05f)
if (!World.BuffManager.HasBuff<GuidingLightBuff>(this))
World.BuffManager.AddBuff(this, this,
new GuidingLightBuff(Math.Min(missingHP, 0.3f),
TickTimer.WaitSeconds(World.Game, 10.0f)));
}
Attributes[GameAttributes.Hitpoints_Cur] = Math.Min(
Attributes[GameAttributes.Hitpoints_Cur] + quantity,
Attributes[GameAttributes.Hitpoints_Max_Total]);
Attributes.BroadcastChangedIfRevealed();
InGameClient.SendMessage(new FloatingNumberMessage
{
ActorID = DynamicID(this),
Number = quantity,
Type = FloatingNumberMessage.FloatType.Green
});
} }
Attributes[GameAttributes.Hitpoints_Cur] = Math.Min( break;
Attributes[GameAttributes.Hitpoints_Cur] + quantity,
Attributes[GameAttributes.Hitpoints_Max_Total]);
Attributes.BroadcastChangedIfRevealed();
InGameClient.SendMessage(new FloatingNumberMessage
{
ActorID = DynamicID(this),
Number = quantity,
Type = FloatingNumberMessage.FloatType.Green
});
} }
break;
}
default: default:
Attributes[GameAttributes.Hitpoints_Cur] = Math.Max( Attributes[GameAttributes.Hitpoints_Cur] = Math.Max(
Attributes[GameAttributes.Hitpoints_Cur] + quantity, Attributes[GameAttributes.Hitpoints_Cur] + quantity,

View File

@ -1,4 +1,4 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
namespace DiIiS_NA.GameServer.MessageSystem namespace DiIiS_NA.GameServer.MessageSystem
@ -1497,6 +1497,9 @@ namespace DiIiS_NA.GameServer.MessageSystem
public static readonly GameAttributeB Soul_shards_unlocked = new(1478, "Soulshardsunlocked"); public static readonly GameAttributeB Soul_shards_unlocked = new(1478, "Soulshardsunlocked");
public static readonly GameAttributeB Item_was_sanctified = new(1479, "Itemwassanctified"); public static readonly GameAttributeB Item_was_sanctified = new(1479, "Itemwassanctified");
public static readonly GameAttributeB Sanctified_items_unlocked = new(1480, "Sanctifieditemsunlocked"); public static readonly GameAttributeB Sanctified_items_unlocked = new(1480, "Sanctifieditemsunlocked");
public static readonly GameAttributeI Heros_Unlocked_Dark_Alchemy_Nodes = new(1481, "HerosunlockedDarkAlchemynodes");
public static readonly GameAttributeI Dark_Alchemy_Powers_Unlocked = new(1482, "DarkAlchemypowersunlocked");
public static readonly GameAttributeB Item_Was_Primalized = new(1483, "Itemwasprimalized");
#endregion #endregion
} }
} }

View File

@ -13,7 +13,7 @@ Enabled = true
; IP address on which the server will be bound ; IP address on which the server will be bound
BindIP = 127.0.0.1 BindIP = 127.0.0.1
; Port for web interactions ; Port for web interactions
WebPort = 83 WebPort = 9800
; Port for the server ; Port for the server
Port = 1119 Port = 1119
@ -49,7 +49,7 @@ CoreActive = true
; IP address on which the game server will be bound ; IP address on which the game server will be bound
BindIP = 127.0.0.1 BindIP = 127.0.0.1
; Port for web interactions ; Port for web interactions
WebPort = 83 WebPort = 9001
; Port for game server connections ; Port for game server connections
Port = 1345 Port = 1345
; IP address for IPv6 bindings ; IP address for IPv6 bindings

View File

@ -8,7 +8,7 @@
<property name="use_proxy_validator">true</property> <property name="use_proxy_validator">true</property>
<property name="command_timeout">0</property> <property name="command_timeout">0</property>
<property name="connection.connection_string"> <property name="connection.connection_string">
Server=diiis-na-db;Database=diiis;User ID=postgres;Password=postgres Server=localhost;Database=diiis;User ID=postgres;Password=postgres
</property> </property>
<property name="connection.release_mode">on_close</property> <property name="connection.release_mode">on_close</property>
<property name="adonet.batch_size">0</property> <property name="adonet.batch_size">0</property>

View File

@ -7,7 +7,7 @@
<property name="use_proxy_validator">true</property> <property name="use_proxy_validator">true</property>
<property name="command_timeout">0</property> <property name="command_timeout">0</property>
<property name="connection.connection_string"> <property name="connection.connection_string">
Server=diiis-na-db;Database=worlds;User ID=postgres;Password=postgres Server=localhost;Database=worlds;User ID=postgres;Password=postgres
</property> </property>
<property name="connection.release_mode">on_close</property> <property name="connection.release_mode">on_close</property>
<property name="adonet.batch_size">0</property> <property name="adonet.batch_size">0</property>