private void SpawnItem(SpawnItemCommand command) { if (meta.ContainsKey(command.data.id) == false) { Debug.LogError("Item not in meta."); return; } ItemDatam itemDatam = meta[command.data.id]; Entity entity = World.EntityManager.CreateEntity(itemArchtype); int id = Bootstrap.GenerateUniqueID(); World.EntityManager.SetComponentData(entity, new WorldItem { id = id, data = command.data, quantity = command.quantity }); World.EntityManager.SetComponentData(entity, new ItemBob { originalPosition = command.spawnPosition }); World.EntityManager.SetComponentData(entity, new Translation { Value = command.spawnPosition }); World.EntityManager.SetComponentData(entity, new NonUniformScale { Value = itemDatam.model.data.scale }); // itemDatam.Value.scale * 0.5f }); World.EntityManager.SetComponentData(entity, new Rotation { Value = Quaternion.Euler(0, UnityEngine.Random.Range(-180, 180), 0) }); RenderMesh newRenderer = new RenderMesh(); newRenderer.castShadows = UnityEngine.Rendering.ShadowCastingMode.On; newRenderer.receiveShadows = true; newRenderer.mesh = new Mesh(); //itemDatam.model.bakedMesh; newRenderer.material = Bootstrap.GetVoxelMaterial(); World.EntityManager.SetSharedComponentData(entity, newRenderer); WorldSpawnSystem.QueueUpdateModel(World.EntityManager, entity, id, itemDatam.model.data); items.Add(id, entity); }
private bool SetCharacter(Entity entity, int id, bool isLoadingPlayer, Entity world, int metaID, int classID, int clanID, float3 position, int creatorID = 0) { if (!World.EntityManager.Exists(world)) { Debug.LogError("Cannot spawn character into a non existing world."); return(false); } if (!World.EntityManager.HasComponent <Voxels.World>(world)) { Debug.LogError("Cannot spawn character into a world without a component."); return(false); } if (characters.ContainsKey(id) == true) { return(false); } characters.Add(id, entity); if (!meta.ContainsKey(metaID)) { Debug.LogError("Meta not contained: " + metaID); return(false); } CharacterDatam characterDatam = meta[metaID]; // ZOXID World.EntityManager.SetComponentData(entity, new ZoxID { id = id, clanID = clanID, creatorID = creatorID }); World.EntityManager.SetComponentData(entity, new Character { metaID = metaID }); // WORLD BINDING int3 voxelDimensions = new int3(16, 64, 16); // float3.zero; if (worldSpawnSystem != null) { voxelDimensions = World.EntityManager.GetComponentData <Voxels.World>(world).voxelDimensions; } // TRANSFORMS World.EntityManager.SetComponentData(entity, new Translation { Value = position }); World.EntityManager.SetComponentData(entity, new Rotation { Value = quaternion.identity }); World.EntityManager.SetComponentData(entity, new NonUniformScale { Value = new float3(1, 1, 1) }); // RENDERING World.EntityManager.SetSharedComponentData(entity, new RenderMesh { material = Bootstrap.GetVoxelMaterial(), mesh = new Mesh(), castShadows = UnityEngine.Rendering.ShadowCastingMode.On, receiveShadows = true }); float3 bodySize = new float3(0.1f, 0.1f, 0.1f); if (characterDatam.vox != null && !isLoadingPlayer) { bodySize = characterDatam.vox.data.GetSize(); World.EntityManager.SetComponentData(entity, new Body { size = bodySize }); // this can be done in equip system WorldSpawnSystem.QueueUpdateModel(World.EntityManager, entity, id, characterDatam.vox.data); } World.EntityManager.SetComponentData(entity, new WorldBound { size = bodySize, world = world, voxelDimensions = voxelDimensions }); World.EntityManager.SetComponentData(entity, characterDatam.stats.Clone()); // Physics World.EntityManager.SetComponentData(entity, new BodyInnerForce { movementForce = characterDatam.movementSpeed, movementTorque = characterDatam.turnSpeed, maxVelocity = characterDatam.maxVelocity }); // combat stuff World.EntityManager.SetComponentData(entity, new Targeter { Value = characterDatam.behaviour.Value.seek }); if (!isLoadingPlayer) { if (classID != 0) { GiveClassSkills(id, classMeta[classID]); } else if (characterDatam.defaultClass) { GiveClassSkills(id, characterDatam.defaultClass); } } Equipment equipment = new Equipment { }; if (!isLoadingPlayer) { equipment.EquipBody(characterDatam.body); equipment.EquipGear(characterDatam.gear); } World.EntityManager.SetComponentData(entity, equipment); return(true); }
protected override void OnUpdate() { Entities.WithAll <Equipment>().ForEach((Entity e, ref Equipment equipment) => { if (equipment.dirty == 1) { equipment.dirty = 0; // get VoxData of the character stored in world system VoxData model = new VoxData { id = Bootstrap.GenerateUniqueID() }; // make this part of equipment //var voxes = new List<VoxData>(); //var positions = new List<int3>(); // after added them all, offset all positions by min, also get max to use as size //var operations = new List<VoxOperation>(); var bodyLayer = new VoxBuildLayer(); bodyLayer.Init(); var gearLayer = new VoxBuildLayer(); gearLayer.Init(); for (int i = 0; i < equipment.body.Length; i++) { // first find core // then for its meta // find any children of that core // then loop for them // different merge function for each axis enum + the offset of the slot var core = equipment.body[i].data; if (meta.ContainsKey(core.id)) { if (core.maleSlot.id == 0) { var coreDatam = meta[core.id]; //Debug.LogError("Adding Core"); bodyLayer.voxes.Add(coreDatam.model.data); bodyLayer.positions.Add(int3.Zero()); bodyLayer.operations.Add(VoxOperation.None); bodyLayer.parents.Add(-1); bodyLayer.bonePositions.Add(coreDatam.model.data.size / 2); bodyLayer.axes.Add((byte)SlotAxis.Center); //float3 realPosition = coreDatam.model.data.size.ToFloat3()/2f; //bodyLayer.realPositions.Add(realPosition); AddChildren(ref equipment, ref bodyLayer, ref gearLayer, //ref voxes, ref positions, ref operations, VoxOperation.None, core, i, int3.Zero()); break; } } } // combine voxes var combinedVoxes = new List <VoxData>(); combinedVoxes.AddRange(bodyLayer.voxes); combinedVoxes.AddRange(gearLayer.voxes); var combinedPositions = new List <int3>(); combinedPositions.AddRange(bodyLayer.positions); combinedPositions.AddRange(gearLayer.positions); int3 size = VoxData.GetSize(combinedVoxes, combinedPositions); int3 min; int3 max; VoxData.CalculateMinMax(combinedVoxes, combinedPositions, out min, out max); int3 addition = VoxData.CalculateAddition(min, max); bodyLayer.positions = VoxData.FixPositions(bodyLayer.positions, addition); gearLayer.positions = VoxData.FixPositions(gearLayer.positions, addition); model.Build(bodyLayer, gearLayer, size); // updates body model using this new vox data float3 bodySize = model.GetSize(); World.EntityManager.SetComponentData(e, new Body { size = bodySize }); WorldBound worldBound = World.EntityManager.GetComponentData <WorldBound>(e); worldBound.size = bodySize; World.EntityManager.SetComponentData(e, worldBound); // this can be done in equip system int id = World.EntityManager.GetComponentData <ZoxID>(e).id; //Debug.LogError("Equipment Mesh updated for: " + id); WorldSpawnSystem.QueueUpdateModel(World.EntityManager, e, id, model); if (World.EntityManager.HasComponent <Skeleton>(e)) { var skeleton = World.EntityManager.GetComponentData <Skeleton>(e); //skeleton.SetBody(model.size, bodyLayer.positions, bodyLayer.voxes); combinedPositions = VoxData.FixPositions(combinedPositions, addition); bodyLayer.bonePositions = VoxData.FixPositions(bodyLayer.bonePositions, addition); skeleton.SetBody(model.size, combinedPositions, combinedVoxes); skeleton.SetBones(World.EntityManager, e, bodyLayer.positions.ToArray(), bodyLayer.voxes.ToArray(), bodyLayer.bonePositions.ToArray(), bodyLayer.parents.ToArray(), bodyLayer.axes.ToArray()); World.EntityManager.SetComponentData(e, skeleton); } } }); }
private void SpawnBullets(int[] metaIDs, float3[] positions, quaternion[] rotations, int[] creatorIDs, int[] clanIDs)/*, float[] damages, float[] bulletSpeeds, )*/ { NativeArray <Entity> bulletEntities = new NativeArray <Entity>(positions.Length, Allocator.Temp); World.EntityManager.Instantiate(bulletPrefab, bulletEntities); // for all bullets, set custom data using indexes entity float timeBegun = UnityEngine.Time.time; for (int i = 0; i < bulletEntities.Length; i++) { int metaID = metaIDs[i]; // increase by character stats and skill level! float damage = UnityEngine.Random.Range(meta[metaID].Value.damage.x, meta[metaID].Value.damage.y); float lifetime = meta[metaID].Value.lifetime; // increase by character stats float speed = meta[metaID].Value.speed; // increase by character stats float scale = meta[metaID].Value.scale; // increase by character stats Entity bulletEntity = bulletEntities[i]; int id = Bootstrap.GenerateUniqueID(); bullets.Add(id, bulletEntity); World.EntityManager.SetComponentData(bulletEntity, new ZoxID { id = id, creatorID = creatorIDs[i], clanID = clanIDs[i] }); // stats World.EntityManager.SetComponentData(bulletEntity, new Bullet { damage = damage, timeStarted = timeBegun, lifetime = lifetime, metaID = metaID }); // Transforms World.EntityManager.SetComponentData(bulletEntity, new Translation { Value = positions[i] }); World.EntityManager.SetComponentData(bulletEntity, new Scale { Value = scale }); //new float3(0.33f, 0.33f, 0.33f) }); World.EntityManager.SetComponentData(bulletEntity, new Rotation { Value = rotations[i] }); // rendering var vox = meta[metaID].model; World.EntityManager.SetSharedComponentData(bulletEntity, new RenderMesh { material = Bootstrap.GetVoxelMaterial(), mesh = new Mesh()//meta[metaID].model.bakedMesh }); WorldSpawnSystem.QueueUpdateModel(World.EntityManager, bulletEntity, id, vox.data); // movement // divide it by mass? or just set acceleration, and mass as parameters if (World.EntityManager.HasComponent <BodyForce>(bulletEntity)) { World.EntityManager.SetComponentData(bulletEntity, new BodyForce { velocity = new float3(0, 0, speed) }); } // Add particle emitter here if (meta[metaID].Value.particlesName != "") { ParticlesManager.instance.PlayParticles( new ParticleSpawnCommand { name = meta[metaID].Value.particlesName, deathParticleName = meta[metaID].Value.deathParticlesName, deathParticleLife = meta[metaID].Value.deathParticleLife }, bulletEntity, World.EntityManager); } } bulletEntities.Dispose(); }