You can now pick up crowbars which spawn randomly on the map. All models scaled properly. Some other crap too probably.

This commit is contained in:
ostaf
2011-05-15 17:16:46 +00:00
parent cc5a3e1b43
commit 0fcc4295cf
13 changed files with 136 additions and 13 deletions

View File

@@ -14,6 +14,7 @@ namespace SS3D.Modules.Items
private Map.Map map;
private OgreManager mEngine;
private Network.NetworkManager networkManager;
private Mobs.MobManager mobManager;
private Dictionary<ushort, Item> itemDict; // ItemID, Item
private List<ushort> itemsToMove;
private List<ushort> itemsToStop;
@@ -22,11 +23,12 @@ namespace SS3D.Modules.Items
private double itemUpdateTime = 20;
private double serverUpdateTime = 100;
public ItemManager(OgreManager _mEngine, Map.Map _map, Network.NetworkManager _networkManager)
public ItemManager(OgreManager _mEngine, Map.Map _map, Network.NetworkManager _networkManager, Mobs.MobManager _mobManager)
{
mEngine = _mEngine;
map = _map;
networkManager = _networkManager;
mobManager = _mobManager;
itemDict = new Dictionary<ushort, Item>();
itemAssemblyName = typeof(SS3D_shared.Item).Assembly.ToString();
itemsToMove = new List<ushort>();
@@ -44,6 +46,9 @@ namespace SS3D.Modules.Items
case ItemMessage.InterpolationPacket:
HandleInterpolationPacket(message);
break;
case ItemMessage.PickUpItem:
HandlePickupItem(message);
break;
default:
break;
}
@@ -71,7 +76,7 @@ namespace SS3D.Modules.Items
{
foreach (Item item in itemDict.Values)
{
mEngine.SceneMgr.DestroyEntity(item.Entity);
//mEngine.SceneMgr.DestroyEntity(item.Entity);
mEngine.SceneMgr.DestroySceneNode(item.Node);
}
itemDict = null;
@@ -156,5 +161,29 @@ namespace SS3D.Modules.Items
mEngine.mNetworkMgr.SendMessage(message, NetDeliveryMethod.ReliableOrdered);
}
#endregion
public void ClickItem(Item item)
{
NetOutgoingMessage message = networkManager.netClient.CreateMessage();
message.Write((byte)NetMessage.ItemMessage);
message.Write((byte)ItemMessage.ClickItem);
message.Write(item.itemID);
networkManager.SendMessage(message, NetDeliveryMethod.Unreliable);
}
private void HandlePickupItem(NetIncomingMessage message)
{
ushort mobID = message.ReadUInt16();
ushort itemID = message.ReadUInt16();
itemDict[itemID].Entity.DetachFromParent();
Mob mob = mobManager.GetMob(mobID);
mob.Entity.AttachObjectToBone("RHand", itemDict[itemID].Entity);
mob.heldItem = itemDict[itemID];
itemDict[itemID].holder = mob;
}
}
}

View File

@@ -280,6 +280,11 @@ namespace SS3D.Modules.Mobs
}
#endregion
public Mob GetMob(ushort mobID)
{
return mobDict[mobID];
}
}
}

View File

@@ -85,7 +85,7 @@ namespace SS3D.States
mEngine.Camera.Position = new Mogre.Vector3(0, 300, 0);
mEngine.Camera.LookAt(new Mogre.Vector3(160,64,160));
itemManager = new ItemManager(mEngine, map, mEngine.mNetworkMgr);
itemManager = new ItemManager(mEngine, map, mEngine.mNetworkMgr, null);
if (!mEngine.mNetworkMgr.isConnected)
{

View File

@@ -62,9 +62,9 @@ namespace SS3D.States
mEngine.mMiyagiSystem.GUIManager.DisposeAllGUIs();
map = new Map(mEngine);
itemManager = new ItemManager(mEngine, map, mEngine.mNetworkMgr);
mobManager = new MobManager(mEngine, map, mEngine.mNetworkMgr);
mobManager = new MobManager(mEngine, map, mEngine.mNetworkMgr);
itemManager = new ItemManager(mEngine, map, mEngine.mNetworkMgr, mobManager);
SetUp();
mEngine.mNetworkMgr.MessageArrived += new NetworkMsgHandler(mNetworkMgr_MessageArrived);
@@ -271,6 +271,19 @@ namespace SS3D.States
mEngine.Camera.ParentNode.ResetOrientation();
}
}
if (button == MOIS.MouseButtonID.MB_Left)
{
Mogre.Vector3 worldPos;
Point mousePos = mEngine.mMiyagiSystem.InputManager.MouseLocation;
Mogre.Vector2 mousePosAbs = new Vector2((float)mousePos.X / (float)mEngine.Window.Width, (float)mousePos.Y / (float)mEngine.Window.Height);
AtomBaseClass atom = HelperClasses.AtomUtil.PickAtScreenPosition(mEngine, mousePosAbs, out worldPos);
if (atom != null && atom.AtomType == AtomType.Item)
{
itemManager.ClickItem((Item)atom);
}
}
}
public override void MouseMove(MOIS.MouseEvent mouseState)

View File

@@ -18,5 +18,7 @@ namespace SS3D_shared
public float runSpeed = 2.0f;
public float speed = 0.0f;
public Item heldItem; // Just a temporary storage spot, for now.
}
}

View File

@@ -28,7 +28,6 @@ namespace SS3D_shared
Node = sceneManager.RootSceneNode.CreateChildSceneNode(entityName);
Entity = sceneManager.CreateEntity(entityName, "male.mesh");
Entity.UserObject = (AtomBaseClass)this;
Node.Scale(15f, 15f, 15f);
Node.Position = position;
Node.AttachObject(Entity);
interpolationPacket = new List<InterpolationPacket>();

View File

@@ -20,6 +20,8 @@ public enum ItemMessage
{
CreateItem = 0,
InterpolationPacket,
ClickItem,
PickUpItem,
UseItem // etc.
}

View File

@@ -27,7 +27,8 @@ namespace SS3D_shared
Node = sceneManager.RootSceneNode.CreateChildSceneNode(entityName);
Entity = sceneManager.CreateEntity(entityName, meshName);
Entity.UserObject = (AtomBaseClass)this;
Node.Scale(0.1f, 0.1f, 0.1f);
//Node.Scale(0.1f, 0.1f, 0.1f);
Node.Position = position;
Node.AttachObject(Entity);
interpolationPacket = new List<InterpolationPacket>();

View File

@@ -15,6 +15,7 @@ namespace SS3D_shared
public List<InterpolationPacket> interpolationPacket;
public DateTime lastUpdate;
public ItemType ItemType = ItemType.None;
public Mob holder; // Just temporary holder for now.
public Item()
{

View File

@@ -13,6 +13,7 @@ namespace SS3d_server.Modules.Items
{
private Map.Map map;
private SS3DNetserver netServer;
private Mobs.MobManager mobManager;
private Dictionary<ushort, Item> itemDict; // ItemID, Item
private List<ushort> itemsToSend;
ushort lastID = 0;
@@ -22,10 +23,11 @@ namespace SS3d_server.Modules.Items
private float fallSpeed = 5.0f; // Just a constant now (not acceleration) for testing.
public ItemManager(SS3DNetserver _netServer, Map.Map _map)
public ItemManager(SS3DNetserver _netServer, Map.Map _map, Mobs.MobManager _mobManager)
{
netServer = _netServer;
map = _map;
mobManager = _mobManager;
itemDict = new Dictionary<ushort, Item>();
itemAssemblyName = typeof(Item).Assembly.ToString();
itemsToSend = new List<ushort>();
@@ -79,6 +81,9 @@ namespace SS3d_server.Modules.Items
case ItemMessage.CreateItem:
HandleCreateItem(message);
break;
case ItemMessage.ClickItem:
HandleClickItem(message);
break;
}
}
@@ -102,6 +107,33 @@ namespace SS3d_server.Modules.Items
SendCreateItem(lastID);
}
private void HandleClickItem(NetIncomingMessage message)
{
ushort itemID = message.ReadUInt16();
ushort mobID = netServer.clientList[message.SenderConnection].mobID;
if (itemDict[itemID].holder == null && mobManager.mobDict[mobID].heldItem == null)
{
itemDict[itemID].holder = mobManager.mobDict[mobID];
mobManager.mobDict[mobID].heldItem = itemDict[itemID];
SendPickupItem(itemID, mobID);
}
}
public void CreateItem(Type type, Vector3 pos)
{
object newItem = Activator.CreateInstance(type);
lastID++;
itemDict[lastID] = (Item)newItem;
itemDict[lastID].serverInfo.position = pos;
itemDict[lastID].itemID = lastID;
SendCreateItem(lastID);
}
// Message size ~288 bits (about 0.036kb).
// This means on map load if we had 40 players, and 500 items,
// to send every item to every player at round start would be
@@ -169,6 +201,26 @@ namespace SS3d_server.Modules.Items
netServer.SendMessageToAll(message);
}
private void SendPickupItem(ushort itemID, ushort mobID)
{
NetOutgoingMessage message = netServer.netServer.CreateMessage();
message.Write((byte)NetMessage.ItemMessage);
message.Write((byte)ItemMessage.PickUpItem);
message.Write(mobID);
message.Write(itemID);
netServer.SendMessageToAll(message);
}
private void SendPickupItem(ushort itemID, ushort mobID, NetConnection netConnection)
{
NetOutgoingMessage message = netServer.netServer.CreateMessage();
message.Write((byte)NetMessage.ItemMessage);
message.Write((byte)ItemMessage.PickUpItem);
message.Write(mobID);
message.Write(itemID);
netServer.SendMessageTo(message, netConnection);
}
// A new player is joining so lets send them everything we know!
// Each module should probably have one of these.
public void NewPlayer(NetConnection netConnection)
@@ -180,6 +232,10 @@ namespace SS3d_server.Modules.Items
continue;
}
SendCreateItem(item.itemID, netConnection);
if (item.holder != null)
{
SendPickupItem(item.itemID, item.holder.mobID, netConnection);
}
}
}
}

View File

@@ -17,7 +17,7 @@ namespace SS3d_server.Modules.Map
private int mapWidth;
private int mapHeight;
private string[,] nameArray;
private int tileSpacing = 16;
public int tileSpacing = 16;
private int wallHeight = 40; // This must be the same as defined in the MeshManager.
#endregion

View File

@@ -14,7 +14,7 @@ namespace SS3d_server.Modules.Mobs
{
private Map.Map map;
private SS3DNetserver netServer;
private Dictionary<ushort, Mob> mobDict; // mobID, mob
public Dictionary<ushort, Mob> mobDict; // mobID, mob
ushort lastID = 0;
private string mobAssemblyName;
private DateTime lastmobUpdateSent = DateTime.Now;

View File

@@ -42,8 +42,8 @@ namespace SS3d_server
map = new Map();
map.InitMap(serverMapName);
itemManager = new ItemManager(this, map);
mobManager = new MobManager(this, map);
itemManager = new ItemManager(this, map, mobManager);
chatManager = new ChatManager(this, mobManager);
}
@@ -58,6 +58,7 @@ namespace SS3d_server
netConfig.Port = serverPort;
netServer = new NetServer(netConfig);
netServer.Start();
AddRandomCrowbars();
active = true;
return false;
}
@@ -309,9 +310,9 @@ namespace SS3d_server
netServer.SendMessage(mapMessage, connection, NetDeliveryMethod.ReliableOrdered);
Console.WriteLine(connection.RemoteEndpoint.Address.ToString() + ": Sending map finished with message size: " + mapMessage.LengthBytes + " bytes");
// Lets also send them all the items.
itemManager.NewPlayer(connection);
// Lets also send them all the items and mobs.
mobManager.NewPlayer(connection);
itemManager.NewPlayer(connection);
}
public void HandleChangeTile(NetIncomingMessage msg)
@@ -448,5 +449,19 @@ namespace SS3d_server
Console.WriteLine("Sending to one with size: " + message.LengthBytes + " bytes");
netServer.SendMessage(message, connection, NetDeliveryMethod.ReliableOrdered);
}
public void AddRandomCrowbars()
{
Crowbar c = new Crowbar();
Type type = c.GetType();
Random r = new Random();
for (int i = 0; i < 10; i++)
{
SS3D_shared.HelperClasses.Vector3 pos = new SS3D_shared.HelperClasses.Vector3(r.NextDouble() * map.GetMapWidth() * map.tileSpacing, 60, r.NextDouble() * map.GetMapHeight() * map.tileSpacing);
itemManager.CreateItem(type, pos);
}
}
}
}