Ссылка на объект не указывает на экземпляр объекта - C# (186518)
Формулировка задачи:
Ссылка на объект не указывает на экземпляр объекта
Вот в этих файлах
Строка 488
http://pastebin.com/p8MJjEZ8
Строка 21
Строка 22
Строка 78
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SmartEngine.Network;
using SagaBNS.Common.Packets;
using SagaBNS.CharacterServer.Network.Client;
namespace SagaBNS.CharacterServer.Packets.Client
{
public class CM_ACTOR_INFO_REQUEST : SagaBNS.Common.Packets.CharacterServer.CM_ACTOR_INFO_REQUEST
{
public override Packet<CharacterPacketOpcode> New()
{
return new CM_ACTOR_INFO_REQUEST();
}
public override void OnProcess(Session<CharacterPacketOpcode> client)
{
((CharacterSession)client).OnActorInfoRequest(this);
}
}
}using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SmartEngine.Core;
using SmartEngine.Network;
using SagaBNS.Common.Packets;
using SagaBNS.Common.Packets.CharacterServer;
using SagaBNS.Common.Actors;
using SagaBNS.CharacterServer.Database;
using SagaBNS.CharacterServer.Cache;
namespace SagaBNS.CharacterServer.Network.Client
{
public partial class CharacterSession : Session<CharacterPacketOpcode>
{
public void OnActorInfoRequest(Packets.Client.CM_ACTOR_INFO_REQUEST p)
{
SM_ACTOR_INFO r= new SM_ACTOR_INFO();
r.SessionID = p.SessionID;
r.Character = CharacterCache.Instance[p.CharID];
this.Network.SendPacket(r);
}
public void OnCharListRequest(Packets.Client.CM_CHAR_LIST_REQUEST p)
{
Logger.ShowInfo(string.Format(this + ":Player is requesting char list for account ID:{0}", p.AccountID));
SM_CHAR_LIST p1 = new SM_CHAR_LIST();
p1.SessionID = p.SessionID;
List<uint> ids = CharacterDB.Instance.GetCharIDs(p.AccountID);
foreach(uint i in CharacterCache.Instance.GetCharIDsForAccount(p.AccountID))
{
if(!ids.Contains(i))
ids.Add(i);
}
List<ActorPC> res = new List<ActorPC>();
foreach (uint i in ids)
{
ActorPC pc = CharacterCache.Instance[i];
if (pc != null)
res.Add(pc);
}
p1.Characters = res;
Logger.ShowInfo(string.Format(this + ":Got {0} Characters", res.Count));
this.Network.SendPacket(p1);
}
public void OnCharCreate(Packets.Client.CM_CHAR_CREATE p)
{
SM_CHAR_CREATE_RESULT p1 = new SM_CHAR_CREATE_RESULT();
p1.SessionID = p.SessionID;
ActorPC chara = p.Character;
if (CharacterDB.Instance.CheckExists(chara.Name, chara.WorldID))
{
p1.Result = SM_CHAR_CREATE_RESULT.Results.ERROR;
p1.CharID = p.Character.CharID;
}
else
{
p1.Result = SM_CHAR_CREATE_RESULT.Results.OK;
p1.CharID = CharacterCache.Instance.Create(p.Character);
}
this.Network.SendPacket(p1);
}
public void OnCharSave(Packets.Client.CM_CHAR_SAVE p)
{
ActorPC pc = p.Character;
BackupData(pc,CharacterCache.Instance[pc.CharID]);
CharacterCache.Instance.Save(pc.CharID, pc);
}
public void OnCharDelete(Packets.Client.CM_CHAR_DELETE p)
{
Logger.ShowInfo(string.Format("Requested deletion of character ID {0}", p.CharID));
CharacterCache.Instance.Delete(p.CharID);
SM_CHAR_DELETE_RESULT p1 = new SM_CHAR_DELETE_RESULT();
p1.SessionID = p.SessionID;
p1.Result = SM_CHAR_DELETE_RESULT.Results.OK;
this.Network.SendPacket(p1);
}
void BackupData(ActorPC newPC,ActorPC oldPC)
{
if (oldPC == null)
return;
newPC.Quests = oldPC.Quests;
newPC.QuestsCompleted = oldPC.QuestsCompleted;
newPC.Skills = oldPC.Skills;
newPC.Locations = oldPC.Locations;
}
}
}using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SmartEngine.Network;
using SagaBNS.Common.Actors;
using SagaBNS.Common.Network;
namespace SagaBNS.Common.Packets.CharacterServer
{
public class SM_ACTOR_INFO : Packet<CharacterPacketOpcode>
{
internal class SM_ACTOR_INFO_INTERNAL<T> : SM_ACTOR_INFO
{
public override Packet<CharacterPacketOpcode> New()
{
return new SM_ACTOR_INFO_INTERNAL<T>();
}
public override void OnProcess(Session<CharacterPacketOpcode> client)
{
((CharacterSession<T>)client).OnActorInfo(this);
}
}
public SM_ACTOR_INFO()
{
this.ID = CharacterPacketOpcode.SM_ACTOR_INFO;
}
public long SessionID
{
get
{
return GetLong(2);
}
set
{
PutLong(value, 2);
}
}
public ActorPC Character
{
get
{
ActorPC pc = new ActorPC();
pc.CharID = GetUInt();
pc.AccountID = GetUInt();
pc.SlotID = GetByte();
pc.WorldID = GetByte();
pc.Name = GetString();
pc.Level = GetByte();
pc.Exp = GetUInt();
pc.Race = (Race)GetByte();
pc.Gender = (Gender)GetByte();
pc.Job = (Job)GetByte();
pc.Appearence1 = GetBytes(GetByte());
pc.Appearence2 = GetBytes(GetByte());
pc.UISettings = GetString();
pc.PartyID = GetULong();
pc.Offline = GetByte() == 1;
pc.Exp = GetUInt();
pc.HP = GetInt();
pc.MP = GetUShort();
pc.MaxHP = GetInt();
pc.MaxMP = GetUShort();
pc.Gold = GetInt();
pc.MapID = GetUInt();
pc.X = GetShort();
pc.Y = GetShort();
pc.Z = GetShort();
pc.Dir = GetUShort();
pc.InventorySize = GetByte();
return pc;
}
set
{
PutUInt(value.CharID);
PutUInt(value.AccountID);
PutByte(value.SlotID);
PutByte(value.WorldID);
PutString(value.Name);
PutByte(value.Level);
PutUInt(value.Exp);
PutByte((byte)value.Race);
PutByte((byte)value.Gender);
PutByte((byte)value.Job);
PutByte((byte)value.Appearence1.Length);
PutBytes(value.Appearence1);
PutByte((byte)value.Appearence2.Length);
PutBytes(value.Appearence2);
PutString(value.UISettings);
PutULong(value.PartyID);
PutByte(value.Offline ? (byte)1 : (byte)0);
PutUInt(value.Exp);
PutInt(value.HP);
PutUShort((ushort)value.MP);
PutInt(value.MaxHP);
PutUShort(value.MaxMP);
PutInt(value.Gold);
PutUInt(value.MapID);
PutShort((short)value.X);
PutShort((short)value.Y);
PutShort((short)value.Z);
PutUShort(value.Dir);
PutByte(value.InventorySize);
}
}
}
}Решение задачи: «Ссылка на объект не указывает на экземпляр объекта»
textual
Листинг программы
OnActorInfoRequest