Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
 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);
             }
         }
     });
 }
Esempio n. 4
0
        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();
        }