public void AddWorldObject(NwWalkerGameObject obj) { //var player = GetPlayer(p => p.UserID == obj.UserID); //if (player == null) return; //obj.CreatorName = player.Name; GameObjectHashmap.Add(obj.Hash, obj); listBox_worldObject.Items.Add(obj); }
public void RemoveWorldObject(string hash) { if (!GameObjectHashmap.ContainsKey(hash)) { return; } NwWalkerGameObject rmObj = GameObjectHashmap[hash]; GameObjectHashmap.Remove(hash); listBox_worldObject.Items.Remove(rmObj); return; }
public void UpdateWorldObjectStatus(string objHash, string scriptHash, byte[] status) { NwWalkerGameObject obj = null; if (GameObjectHashmap.TryGetValue(objHash, out obj)) { var scr = Array.Find(obj.Scripts, s => s.Hash == scriptHash); if (scr != null) { scr.Status = status; } //if (listBox_worldObject.SelectedItem == obj && checkBox_worldObject_autoUpdate.Checked) //{ // textBox_wordObject_status.Text = status; //} } }
public void ItemUse(NwWalkerGameObject go, WalkerPlayer player, bool sync) { MMW.Invoke(() => { try { if (!Players.Exists(p => (string)p.Properties["userID"] == player.UserID)) { return; } var wo = Resources.Objects[go.ObjectHash]; if (!wo.Loaded) { wo.Load(); } var g = GameObjectFactory.CreateItem(go, wo, player, "item", wo.Bones != null ? "Deferred Physical Skin" : "Deferred Physical"); g.Properties["user"] = player; g.Properties["userID"] = player.UserID; g.Properties["sessionID"] = player.SessionID; g.Hash = go.Hash; g.Transform.Parent = Players.Find(p => (string)p.Properties["userID"] == player.UserID).Transform; g.Transform.UpdatePhysicalTransform(); MMW.RegistGameObject(g); if (sync) { SyncWorldObjects.Add(g); } else { WorldObjects.Add(g); } } catch { MMW.BroadcastMessage("log", $"[ERROR] failed to use item \"{go.Name}\""); } }); }
public void PutGameObject(NwWalkerGameObject go, bool sync) { MMW.Invoke(() => { try { var wo = Resources.Objects[go.ObjectHash]; if (!wo.Loaded) { wo.Load(); } var g = GameObjectFactory.CreateGameObject(go, wo, wo.Name, wo.Bones != null ? "Deferred Physical Skin" : "Deferred Physical"); g.Hash = go.Hash; g.Transform.Position = go.Position.FromVec3f(); g.Transform.Rotate = go.Rotation.FromVec3f(); if (go.Scale != null) { g.Transform.Scale = go.Scale.FromVec3f(); } g.Transform.UpdatePhysicalTransform(); MMW.RegistGameObject(g); if (sync) { SyncWorldObjects.Add(g); } else { WorldObjects.Add(g); } } catch { MMW.BroadcastMessage("log", $"[ERROR] object \"{go.Name}\" entry failed"); } }); }
protected override void Update(double deltaTime) { if (Input.IsButtonPressed(OpenTK.Input.MouseButton.Right)) { var idx = userData.ItemSelectIndex; var item = userData.HotbarItems[idx]; if (item == null) { return; } if (!resources.Objects.ContainsKey(item.Info.Hash)) { MMW.BroadcastMessage("log", "item unavailable in this world"); } var scripts = new List <NwWalkerGameObject.NwScriptInfo>(); var objs = MMW.GetAsset <WorldResources>().Objects; foreach (var s in objs[item.Info.Hash].nwObject.Scripts) { scripts.Add(new NwWalkerGameObject.NwScriptInfo() { Hash = s.Hash, Status = null, }); } var obj = new NwWalkerGameObject() { CreateDate = DateTime.Now.ToString(), CreatorName = userData.Name, Hash = Util.CreateHash(12), Name = item.Info.Name, ObjectHash = item.Info.Hash, Position = data.position.ToVec3f(), Rotation = data.rotate.ToVec3f(), Scale = new Vector3f(1.0f, 1.0f, 1.0f), SessionID = userData.SessionID, UserID = userData.UserID, Scripts = scripts.ToArray(), }; if (focusedObj != null && item.Info.Type == "Put") { if (item.Info.Consume) { item.Number--; if (item.Number <= 0) { userData.HotbarItems[idx] = null; } } if (item.Info.Sync) { server.SendTcp(DataType.RequestObjectPut, obj); MMW.BroadcastMessage("log", "sync put item"); } else if (item.Number > 0) { MMW.FindGameComponent <WalkerScript>().PutGameObject(obj, false); MMW.BroadcastMessage("log", "put item"); } } else if (item.Info.Type == "Use") { if (item.Info.Consume) { item.Number--; if (item.Number <= 0) { userData.HotbarItems[idx] = null; } } if (item.Info.Sync) { server.SendTcp(DataType.RequestItemUsed, obj); MMW.BroadcastMessage("log", "sync use item"); } else if (item.Number > 0) { MMW.FindGameComponent <WalkerScript>().ItemUse(obj, GameObject.GetComponent <CharacterInfo>().Player, false); MMW.BroadcastMessage("log", "use item"); } } } else if (Input.IsButtonDown(OpenTK.Input.MouseButton.Right)) { var idx = userData.ItemSelectIndex; var item = userData.HotbarItems[idx]; if (item == null) { return; } if (!resources.Objects.ContainsKey(item.Info.Hash)) { MMW.BroadcastMessage("log", "item unavailable in this world"); } if (item.Info.Type == "Throw") { } } else if (Input.IsKeyPressed(OpenTK.Input.Key.Q)) { var idx = userData.ItemSelectIndex; var item = userData.HotbarItems[idx]; if (item == null) { return; } userData.HotbarItems[idx] = null; } }
public static GameObject CreateItem(NwWalkerGameObject wgo, WorldObject obj, WalkerPlayer player, string name, string shader = "Deferred Physical Skin") { if (!obj.Loaded) { obj.Load(); } var sh = MMW.GetAsset <Shader>(shader); foreach (var mat in obj.Materials) { mat.Shader = sh; } var go = new GameObject(name); go.Tags.Add("item"); //go.Layer = GameObject.LayerAfterRender + 1; if (obj.Tags != null) { foreach (var t in obj.Tags) { go.Tags.Add(t); } } // mesh renderer var mr = go.AddComponent <MeshRenderer>(); mr.Mesh = obj.Mesh; mr.Bones = obj.Bones; for (var m = 0; m < mr.Mesh.SubMeshCount; m++) { var matIndex = mr.Mesh.GetMaterialIndex(m); mr.SetMaterial(matIndex, obj.Materials[matIndex], false); } // motion if (obj.Bones != null) { var animator = go.AddComponent <ComputeAnimator>(); animator.Bones = mr.Bones; if (obj.Motions != null) { foreach (var m in obj.Motions) { animator.AddMotion(m.Name, m); } } var ac = go.AddComponent <AnimationController>(); ac.Play("idle"); } // morph if (obj.Morphs != null) { var morpher = go.AddComponent <Morpher>(); foreach (var m in obj.Morphs) { if (m == null) { continue; } morpher.AddMorph(m.Name, m); } } // physics /* * var center = Vector3.Zero; * if (obj.CollisionShape != null) * { * Collider c = null; * if (obj.CollisionShape is CollisionCapsule) * { * var s = obj.CollisionShape as CollisionCapsule; * c = go.AddComponent<CapsuleCollider>(s.Radius, s.Height - s.Radius * 2.0f); * if (!obj.PhysicalMaterial.IsRigidBody) c.Position.Y = s.Height * 0.5f; * center = new Vector3(0.0f, s.Height * 0.5f, 0.0f); * } * else if (obj.CollisionShape is CollisionCylinder) * { * //var s = obj.CollisionShape as CollisionCylinder; * //c = go.AddComponent<CylinderCollider>(s.Radius, s.Height - s.Radius * 2.0f); * //c.Position.Y = s.Height * 0.5f; * } * else if (obj.CollisionShape is CollisionBox) * { * var s = obj.CollisionShape as CollisionBox; * c = go.AddComponent<BoxCollider>(s.HalfExtents); * if (!obj.PhysicalMaterial.IsRigidBody) c.Position.Y = s.HalfExtents.Y; * center = new Vector3(0, s.HalfExtents.Y, 0); * } * else if (obj.CollisionShape is CollisionSphere) * { * var s = obj.CollisionShape as CollisionSphere; * c = go.AddComponent<SphereCollider>(s.Radius); * if (!obj.PhysicalMaterial.IsRigidBody) c.Position.Y = s.Radius; * center = new Vector3(0, s.Radius, 0); * } * * c.CollideGroup = BulletSharp.CollisionFilterGroups.DefaultFilter; * c.CollideMask = BulletSharp.CollisionFilterGroups.SensorTrigger; * } */ /* * if (obj.PhysicalMaterial.IsRigidBody) * { * var rb = go.AddComponent<RigidBody>(); * * rb.CollideGroup = BulletSharp.CollisionFilterGroups.DefaultFilter; * rb.CollideMask = BulletSharp.CollisionFilterGroups.SensorTrigger; * rb.Mass = obj.PhysicalMaterial.Mass; * rb.Friction = obj.PhysicalMaterial.Friction; * rb.RollingFriction = obj.PhysicalMaterial.RollingFriction; * rb.AnisotropicFriction = obj.PhysicalMaterial.AnisotropicFriction; * rb.Restitution = obj.PhysicalMaterial.Restitution; * rb.LinearDamping = obj.PhysicalMaterial.LinearDamping; * rb.AngulerDamping = obj.PhysicalMaterial.AngulerDamping; * * rb.FreezePosition = obj.PhysicalMaterial.FreezePosition; * rb.FreezeRotation = obj.PhysicalMaterial.FreezeRotation; * rb.DisableDeactivation = obj.PhysicalMaterial.DisableDeactivation; * rb.Kinematic = obj.PhysicalMaterial.Kinematic; * * rb.CenterOfMass = center; * * go.Transform.Position = center; * } */ // sound if (obj.Sounds != null) { var sc = go.AddComponent <SoundController>(); foreach (var s in obj.Sounds) { sc.Sounds.Add(s.Name, s.Clone()); } } go.AddComponent <WalkerObjectInfo>(obj); // scripts if (obj.Scripts != null) { var pl = MMW.FindGameComponent <WalkerScript>().Players.Find(p => (string)p.Properties["userID"] == player.UserID); var ws = pl.GetComponent <WalkerGameObjectScript>().Script; var wr = MMW.GetAsset <WorldResources>(); foreach (var asm in obj.Scripts) { var scr = WorldResources.CreateScript(asm); scr.ParentScript = ws; scr.ScriptHash = wr.GetHash(asm); scr.HostUserID = wgo.UserID; scr.IsHost = MMW.GetAsset <UserData>().UserID == wgo.UserID; go.AddComponent <WalkerGameObjectScript>(go, scr, null); } } return(go); }
protected override void Update(double deltaTime) { if (time > 0.0) { time -= deltaTime; } if (time < 0.0 && totalCoin < maxCoin) { time += userData.CoinSpownTime; var r = Util.RandomInt(0, 100); var coin = cupperCoin; if (r >= 90) { coin = silverCoin; } else if (r == 99) { coin = goldCoin; } RayTestResult res = null; int test = 5; while (test > 0) { var x = MMWMath.Lerp(bounds.Min.X, bounds.Max.X, Util.RandomFloat()); var z = MMWMath.Lerp(bounds.Min.Z, bounds.Max.Z, Util.RandomFloat()); var pos = new Vector4(x, 0.0f, z, 1.0f) * Transform.WorldTransform; var rays = Bullet.RayTest(new Vector3(pos.X, 100.0f, pos.Z), new Vector3(pos.X, -50.0f, pos.Z)); if (rays.Count > 0 && rays[0].GameObject.Tags.Contains("world")) { res = rays[0]; break; } test--; } if (res != null) { var go = new NwWalkerGameObject() { CreateDate = DateTime.Now.ToString(), CreatorName = MMW.GetAsset <UserData>().UserName, Hash = Util.CreateHash(12), Name = "coin", ObjectHash = coin.Hash, Position = (res.Position + Vector3.UnitY * 0.2f).ToVec3f(), Rotation = new Vector3f(), Scale = new Vector3f(1, 1, 1), SessionID = MMW.GetAsset <UserData>().SessionID, UserID = MMW.GetAsset <UserData>().UserID, }; MMW.FindGameComponent <WalkerScript>().PutGameObject(go, false); totalCoin++; } } }