459 lines
18 KiB
C#
459 lines
18 KiB
C#
using NLog;
|
|
using Server.SQL;
|
|
using Server.System;
|
|
|
|
namespace Server.Manager
|
|
{
|
|
public class ItemManager
|
|
{
|
|
private static readonly NLog.ILogger logger = LogManager.GetCurrentClassLogger();
|
|
|
|
User user;
|
|
|
|
public ItemBox box;
|
|
|
|
public ItemManager(User user)
|
|
{
|
|
this.user = user;
|
|
box = new ItemBox(user);
|
|
}
|
|
|
|
public void addReward(long reward)
|
|
{
|
|
RewardData rewardData;
|
|
|
|
rewardData = Statics.rewardExcel.getRewardData(reward);
|
|
switch (rewardData.reward_item_type)
|
|
{
|
|
case eRewardItemType.gold:
|
|
user.gold += rewardData.return_count;
|
|
break;
|
|
case eRewardItemType.freecash:
|
|
user.free_cash += rewardData.return_count;
|
|
break;
|
|
case eRewardItemType.paycash:
|
|
user.pay_cash += rewardData.return_count;
|
|
break;
|
|
case eRewardItemType.character:
|
|
DeckUnitInfo deckUnitInfo = new DeckUnitInfo();
|
|
deckUnitInfo.user_id = user.id;
|
|
deckUnitInfo.unit_data_id = rewardData.return_item;
|
|
deckUnitInfo.count = rewardData.return_count;
|
|
box.Add(deckUnitInfo);
|
|
break;
|
|
case eRewardItemType.equipment:
|
|
Random rand = new Random();
|
|
for (int n = 0; n < rewardData.return_count; n++)
|
|
{
|
|
Equipment equipment = new Equipment();
|
|
equipment.user_id = user.id;
|
|
equipment.equip_unit = 0;
|
|
equipment.rand_stats = rand.Next(5);
|
|
equipment.equipment_data_id = rewardData.return_item;
|
|
box.Add(equipment);
|
|
}
|
|
break;
|
|
case eRewardItemType.consumable:
|
|
ConsumableItemData consumableItemData = Statics.consumableItemExcel.getConsumableItemData(rewardData.return_item);
|
|
switch (consumableItemData.item_type)
|
|
{
|
|
case eItemType.exp:
|
|
case eItemType.package:
|
|
ConsumableItem consumableItem = new ConsumableItem();
|
|
consumableItem.user_id = user.id;
|
|
consumableItem.consumable_item_data_id = rewardData.return_item;
|
|
consumableItem.count = rewardData.return_count;
|
|
box.Add(consumableItem);
|
|
break;
|
|
case eItemType.random:
|
|
randomItem(consumableItemData.reward, rewardData.return_count);
|
|
break;
|
|
}
|
|
|
|
break;
|
|
case eRewardItemType.etc:
|
|
EtcItem etcItem = new EtcItem();
|
|
etcItem.user_id = user.id;
|
|
etcItem.etc_item_data_id = rewardData.return_item;
|
|
etcItem.count = rewardData.return_count;
|
|
box.Add(etcItem);
|
|
break;
|
|
default:
|
|
throw new RuntimeException("Not case", Error.nodata);
|
|
}
|
|
}
|
|
|
|
public void addUnit(long unitDataId)
|
|
{
|
|
DeckUnitInfo deckUnitInfo = new DeckUnitInfo();
|
|
deckUnitInfo.user_id = user.id;
|
|
deckUnitInfo.count = 1;
|
|
deckUnitInfo.unit_data_id = unitDataId;
|
|
box.Add(deckUnitInfo);
|
|
}
|
|
|
|
public void randomItem(int group, int count)
|
|
{
|
|
List<RandomRewardData> randomRewardDatas = Statics.randomRewardExcel.getRandomRewardDataGroup(group);
|
|
|
|
int maxProb = 0;
|
|
List<int> zero = new List<int>();
|
|
List<int> ints = new List<int>();
|
|
|
|
//확정보상부터 지급
|
|
for (int n = 0; n < randomRewardDatas.Count; n++)
|
|
{
|
|
if (randomRewardDatas[n].prob == -1)
|
|
{
|
|
//보상지급
|
|
switch (randomRewardDatas[n].reward_item_type)
|
|
{
|
|
case eRewardItemType.gold:
|
|
user.gold += (randomRewardDatas[n].return_count * count);
|
|
break;
|
|
case eRewardItemType.freecash:
|
|
user.free_cash += (randomRewardDatas[n].return_count * count);
|
|
break;
|
|
case eRewardItemType.paycash:
|
|
user.pay_cash += (randomRewardDatas[n].return_count * count);
|
|
break;
|
|
case eRewardItemType.character:
|
|
DeckUnitInfo deckUnitInfo = new DeckUnitInfo();
|
|
deckUnitInfo.user_id = user.id;
|
|
deckUnitInfo.unit_data_id = randomRewardDatas[n].reward;
|
|
deckUnitInfo.count = (randomRewardDatas[n].return_count * count);
|
|
box.Add(deckUnitInfo);
|
|
break;
|
|
case eRewardItemType.equipment:
|
|
Random rand = new Random();
|
|
int reward_count = (randomRewardDatas[n].return_count * count);
|
|
for (int m = 0; m < reward_count; m++)
|
|
{
|
|
Equipment equipment = new Equipment();
|
|
equipment.user_id = user.id;
|
|
equipment.equip_unit = 0;
|
|
equipment.rand_stats = rand.Next(5);
|
|
equipment.equipment_data_id = randomRewardDatas[n].reward;
|
|
box.Add(equipment);
|
|
}
|
|
break;
|
|
case eRewardItemType.consumable:
|
|
//패키지에서 나온 아이탬은 절대 가챠를 돌리지 않고 아이템 형태로 인벤 지급
|
|
ConsumableItem consumableItem = new ConsumableItem();
|
|
consumableItem.user_id = user.id;
|
|
consumableItem.consumable_item_data_id = randomRewardDatas[n].reward;
|
|
consumableItem.count = (randomRewardDatas[n].return_count * count);
|
|
box.Add(consumableItem);
|
|
break;
|
|
case eRewardItemType.etc:
|
|
EtcItem etcItem = new EtcItem();
|
|
etcItem.user_id = user.id;
|
|
etcItem.etc_item_data_id = randomRewardDatas[n].reward;
|
|
etcItem.count = (randomRewardDatas[n].return_count * count);
|
|
box.Add(etcItem);
|
|
break;
|
|
default:
|
|
throw new RuntimeException("Not case", Error.nodata);
|
|
}
|
|
//지급된 보상은 가챠에서 제외
|
|
randomRewardDatas.RemoveAt(n);
|
|
n--;
|
|
}
|
|
else if (randomRewardDatas[n].prob == 0)
|
|
{
|
|
zero.Add(n);
|
|
}
|
|
else
|
|
{
|
|
maxProb += randomRewardDatas[n].prob;
|
|
for(int m = 0; m < randomRewardDatas[n].prob; m++)
|
|
{
|
|
ints.Add(n);
|
|
}
|
|
}
|
|
}
|
|
|
|
//모든것이 확정보상일경우를 대비
|
|
if(randomRewardDatas.Count != 0)
|
|
{
|
|
Random rand = new Random();
|
|
if (maxProb == 0)
|
|
{
|
|
maxProb = randomRewardDatas.Count;
|
|
for (int n = 0; n < maxProb; n++)
|
|
{
|
|
ints.Add(n);
|
|
}
|
|
}
|
|
else
|
|
maxProb = 10000;
|
|
|
|
|
|
for (int n = 0; n < count; n++)
|
|
{
|
|
int select = rand.Next(10000);
|
|
int selectItem = 0;
|
|
if(select < ints.Count)
|
|
{
|
|
selectItem = ints[select];
|
|
}
|
|
else
|
|
{
|
|
select = rand.Next(zero.Count);
|
|
selectItem = zero[select];
|
|
}
|
|
switch (randomRewardDatas[selectItem].reward_item_type)
|
|
{
|
|
case eRewardItemType.gold:
|
|
user.gold += (randomRewardDatas[selectItem].return_count * count);
|
|
break;
|
|
case eRewardItemType.freecash:
|
|
user.free_cash += (randomRewardDatas[selectItem].return_count * count);
|
|
break;
|
|
case eRewardItemType.paycash:
|
|
user.pay_cash += (randomRewardDatas[selectItem].return_count * count);
|
|
break;
|
|
case eRewardItemType.character:
|
|
DeckUnitInfo deckUnitInfo = new DeckUnitInfo();
|
|
deckUnitInfo.user_id = user.id;
|
|
deckUnitInfo.unit_data_id = randomRewardDatas[selectItem].reward;
|
|
deckUnitInfo.count = (randomRewardDatas[selectItem].return_count * count);
|
|
box.Add(deckUnitInfo);
|
|
break;
|
|
case eRewardItemType.equipment:
|
|
int reward_count = (randomRewardDatas[selectItem].return_count * count);
|
|
for (int m = 0; m < reward_count; m++)
|
|
{
|
|
Equipment equipment = new Equipment();
|
|
equipment.user_id = user.id;
|
|
equipment.equip_unit = 0;
|
|
equipment.rand_stats = rand.Next(5);
|
|
equipment.equipment_data_id = randomRewardDatas[selectItem].reward;
|
|
box.Add(equipment);
|
|
}
|
|
break;
|
|
case eRewardItemType.consumable:
|
|
//패키지에서 나온 아이탬은 절대 가챠를 돌리지 않고 아이템 형태로 인벤 지급
|
|
ConsumableItem consumableItem = new ConsumableItem();
|
|
consumableItem.user_id = user.id;
|
|
consumableItem.consumable_item_data_id = randomRewardDatas[selectItem].reward;
|
|
consumableItem.count = (randomRewardDatas[selectItem].return_count * count);
|
|
box.Add(consumableItem);
|
|
break;
|
|
case eRewardItemType.etc:
|
|
EtcItem etcItem = new EtcItem();
|
|
etcItem.user_id = user.id;
|
|
etcItem.etc_item_data_id = randomRewardDatas[selectItem].reward;
|
|
etcItem.count = (randomRewardDatas[selectItem].return_count * count);
|
|
box.Add(etcItem);
|
|
break;
|
|
default:
|
|
throw new RuntimeException("Not case", Error.nodata);
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
//리워드 아이탬 획득 코드 작성
|
|
//패키지 구매시 패키지를 전부 풀어서 아이탬을 획득하는 코드 작성
|
|
}
|
|
|
|
public class ItemBox
|
|
{
|
|
//유닛
|
|
List<DeckUnitInfo> _deckUnitInfo;
|
|
public List<DeckUnitInfo> deckUnitInfo { get { return _deckUnitInfo; } }
|
|
public List<DeckUnitInfo> addDeckUnitInfo;
|
|
|
|
//장비
|
|
List<Equipment> _equipment;
|
|
public List<Equipment> equipment { get { return _equipment; } }
|
|
public List<Equipment> addEquipment;
|
|
|
|
//소모품
|
|
List<ConsumableItem> _consumableItem;
|
|
public List<ConsumableItem> consumableItem { get { return _consumableItem; } }
|
|
public List<ConsumableItem> addConsumableItem;
|
|
|
|
//기타
|
|
List<EtcItem> _etcItem;
|
|
public List<EtcItem> etcItem { get { return _etcItem; } }
|
|
public List<EtcItem> addEtcItem;
|
|
|
|
User user;
|
|
public ItemBox(User user)
|
|
{
|
|
this.user = user;
|
|
_deckUnitInfo = Statics.deckUnitInfoSQL.SelectUid(user.id);
|
|
_equipment = Statics.equipmentrSQL.SelectUid(user.id);
|
|
_consumableItem = Statics.consumableItemSQL.SelectUid(user.id);
|
|
_etcItem = Statics.etcItemSQL.SelectUid(user.id);
|
|
addDeckUnitInfo = new List<DeckUnitInfo>();
|
|
addEquipment = new List<Equipment>();
|
|
addConsumableItem = new List<ConsumableItem>();
|
|
addEtcItem = new List<EtcItem>();
|
|
}
|
|
|
|
public void SaveSQL()
|
|
{
|
|
Statics.userSQL.Update(user);
|
|
Statics.userSQL.SaveChanges();
|
|
if (addDeckUnitInfo.Count != 0)
|
|
{
|
|
Statics.deckUnitInfoSQL.Insert(addDeckUnitInfo);
|
|
Statics.deckUnitInfoSQL.SaveChanges();
|
|
}
|
|
if (addEquipment.Count != 0)
|
|
{
|
|
Statics.equipmentrSQL.Insert(addEquipment);
|
|
Statics.equipmentrSQL.SaveChanges();
|
|
}
|
|
if (addConsumableItem.Count != 0)
|
|
{
|
|
for (int n = 0; n < addConsumableItem.Count; n++)
|
|
{
|
|
if (addConsumableItem[n].id == 0)
|
|
Statics.consumableItemSQL.Insert(addConsumableItem[n]);
|
|
else
|
|
Statics.consumableItemSQL.Update(_consumableItem[_consumableItem.FindIndex(item => item.id == addConsumableItem[n].id)]);
|
|
|
|
}
|
|
Statics.consumableItemSQL.SaveChanges();
|
|
}
|
|
if (addEtcItem.Count != 0)
|
|
{
|
|
for (int n = 0; n < addEtcItem.Count; n++)
|
|
{
|
|
if (addEtcItem[n].id == 0)
|
|
Statics.etcItemSQL.Insert(addEtcItem[n]);
|
|
else
|
|
Statics.etcItemSQL.Update(_etcItem[_etcItem.FindIndex(item => item.id == addEtcItem[n].id)]);
|
|
}
|
|
Statics.etcItemSQL.SaveChanges();
|
|
}
|
|
}
|
|
|
|
public bool Add(DeckUnitInfo item)
|
|
{
|
|
int index = _deckUnitInfo.FindIndex(n => n.unit_data_id == item.unit_data_id);
|
|
int addIndex = addDeckUnitInfo.FindIndex(n => n.unit_data_id == item.unit_data_id);
|
|
if (index == -1)
|
|
{
|
|
_deckUnitInfo.Add(item);
|
|
}
|
|
else
|
|
{
|
|
_deckUnitInfo[index].count += item.count;
|
|
item.id = _deckUnitInfo[index].id;
|
|
}
|
|
if (addIndex == -1)
|
|
{
|
|
addDeckUnitInfo.Add(item);
|
|
}
|
|
else
|
|
{
|
|
addDeckUnitInfo[index].count += item.count;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public bool Add(List<DeckUnitInfo> items)
|
|
{
|
|
foreach (DeckUnitInfo item in items)
|
|
{
|
|
if (!Add(item))
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public bool Add(Equipment item)
|
|
{
|
|
_equipment.Add(item);
|
|
addEquipment.Add(item);
|
|
return true;
|
|
}
|
|
|
|
public bool Add(List<Equipment> items)
|
|
{
|
|
foreach (Equipment item in items)
|
|
{
|
|
if (!Add(item))
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public bool Add(ConsumableItem item)
|
|
{
|
|
int index = _consumableItem.FindIndex(n => n.consumable_item_data_id == item.consumable_item_data_id);
|
|
int addIndex = addConsumableItem.FindIndex(n => n.consumable_item_data_id == item.consumable_item_data_id);
|
|
if (index == -1)
|
|
{
|
|
_consumableItem.Add(item);
|
|
}
|
|
else
|
|
{
|
|
_consumableItem[index].count += item.count;
|
|
item.id = _consumableItem[index].id;
|
|
}
|
|
if (addIndex == -1)
|
|
{
|
|
addConsumableItem.Add(item);
|
|
}
|
|
else
|
|
{
|
|
addConsumableItem[index].count += item.count;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public bool Add(List<ConsumableItem> items)
|
|
{
|
|
foreach(ConsumableItem item in items)
|
|
{
|
|
if (!Add(item))
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public bool Add(EtcItem item)
|
|
{
|
|
int index = _etcItem.FindIndex(n => n.etc_item_data_id == item.etc_item_data_id);
|
|
int addIndex = addEtcItem.FindIndex(n => n.etc_item_data_id == item.etc_item_data_id);
|
|
if (index == -1)
|
|
{
|
|
_etcItem.Add(item);
|
|
}
|
|
else
|
|
{
|
|
_etcItem[index].count += item.count;
|
|
item.id = _etcItem[index].id;
|
|
}
|
|
if (addIndex == -1)
|
|
{
|
|
addEtcItem.Add(item);
|
|
}
|
|
else
|
|
{
|
|
addEtcItem[index].count += item.count;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public bool Add(List<EtcItem> items)
|
|
{
|
|
foreach (EtcItem item in items)
|
|
{
|
|
if (!Add(item))
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
|
|
}
|