public override void BuildCommand(int id, DVector3 position) { if (buildInProgress) { return; } if (buildables[id] == null) { return; } position = new DVector3(position.x, World.current.map.Height(position), position.z); currentMode = World.current.entityPrototypes[buildables[id]].BuildMode(); if (currentMode == BuildMode.BUILD_IN_PLACE || currentMode == BuildMode.BUILD_IMMEDIATE) { if (!CheckBuildPlacement(id, position)) { return; } } // TODO: Check placement for BUILD_foo here. if (!HaveEnoughResources(id)) { return; } ConsumeResources(id, false); buildInProgress = true; totalTime = DReal.Parse(World.current.entityPrototypes[buildables[id]].data["buildTime"]); remainingTime = totalTime; buildingWhat = id; buildingPosition = position; switch (currentMode) { case BuildMode.SPAWN: break; case BuildMode.SPAWN_IMMEDIATE: World.current.Instantiate(buildables[buildingWhat], entity.team, entity.RandomSpawnPosition(spawnMin, spawnMax)); World.current.eventListener.Animate(entity, "Spawn"); break; case BuildMode.BUILD_THEN_PLACE: break; case BuildMode.BUILD_IN_PLACE: var proto = World.current.entityPrototypes[buildables[id]]; var ent = new Entity(entity.team, position, proto); // Only instantiate the collider and the health component, if any. foreach (var cproto in proto.components) { if (cproto.kind == "Collider") { ent.AddComponent(new Collider(ent, cproto)); } else if (cproto.kind == "Health") { ent.AddComponent(new Health(ent, cproto)); } } inPlaceConstruction = new PartialBuilding(ent); ent.AddComponent(inPlaceConstruction); break; case BuildMode.BUILD_IMMEDIATE: World.current.Instantiate(buildables[buildingWhat], entity.team, buildingPosition); break; } }
public Entity Instantiate(string prototypeName, int team, DVector3 position) { var proto = entityPrototypes[prototypeName]; var ent = new Entity(team, position, proto); foreach (var cproto in proto.components) { Component comp = null; if (cproto.kind == "Wizard") { comp = new Wizard(ent, cproto); } else if (cproto.kind == "WizardTower") { comp = new WizardTower(ent, cproto); } else if (cproto.kind == "BasicUnit") { comp = new BasicUnit(ent, cproto); } else if (cproto.kind == "GroundMotor") { comp = new GroundMotor(ent, cproto); } else if (cproto.kind == "AirMotor") { comp = new AirMotor(ent, cproto); } else if (cproto.kind == "ResourceCollectionPoint") { comp = new ResourceCollectionPoint(ent, cproto); } else if (cproto.kind == "ResourceHarvester") { comp = new ResourceHarvester(ent, cproto); } else if (cproto.kind == "Truck") { comp = new Truck(ent, cproto); } else if (cproto.kind == "MineTruck") { comp = new MineTruck(ent, cproto); } else if (cproto.kind == "Mine") { comp = new Mine(ent, cproto); } else if (cproto.kind == "Factory") { comp = new Factory(ent, cproto); } else if (cproto.kind == "ResourceSource") { comp = new ResourceSource(ent, cproto); } else if (cproto.kind == "ProjectileWeapon") { comp = new ProjectileWeapon(ent, cproto); } else if (cproto.kind == "Projectile") { comp = new Projectile(ent, cproto); } else if (cproto.kind == "Collider") { comp = new Collider(ent, cproto); } else if (cproto.kind == "HitscanWeapon") { comp = new HitscanWeapon(ent, cproto); } else if (cproto.kind == "Health") { comp = new Health(ent, cproto); } else if (cproto.kind == "BuildRadius") { comp = new BuildRadius(ent, cproto); } else if (cproto.kind == "Team") { comp = new Team(ent, cproto); } else if (cproto.kind == "ResourcePool") { comp = new ResourcePool(ent, cproto); } else { Logger.Log("Unknown component type {0}", cproto.kind); } ent.AddComponent(comp); } return(ent); }