| 1155 | } |
| 1156 | |
| 1157 | void CopyProjectiles(RemoteFortressReader::MapBlock * NetBlock) |
| 1158 | { |
| 1159 | for (auto proj = world->projectiles.all.next; proj != NULL; proj = proj->next) |
| 1160 | { |
| 1161 | STRICT_VIRTUAL_CAST_VAR(projectile, df::proj_itemst, proj->item); |
| 1162 | if (projectile == NULL) |
| 1163 | continue; |
| 1164 | auto NetItem = NetBlock->add_items(); |
| 1165 | CopyItem(NetItem, projectile->item); |
| 1166 | NetItem->set_projectile(true); |
| 1167 | if (projectile->flags.bits.parabolic) |
| 1168 | { |
| 1169 | NetItem->set_subpos_x(projectile->pos_x / 100000.0); |
| 1170 | NetItem->set_subpos_y(projectile->pos_y / 100000.0); |
| 1171 | NetItem->set_subpos_z(projectile->pos_z / 140000.0); |
| 1172 | NetItem->set_velocity_x(projectile->speed_x / 100000.0); |
| 1173 | NetItem->set_velocity_y(projectile->speed_y / 100000.0); |
| 1174 | NetItem->set_velocity_z(projectile->speed_z / 140000.0); |
| 1175 | } |
| 1176 | else |
| 1177 | { |
| 1178 | DFCoord diff = projectile->target_pos - projectile->origin_pos; |
| 1179 | float max_dist = max(max(abs(diff.x), abs(diff.y)), abs(diff.z)); |
| 1180 | NetItem->set_subpos_x(projectile->origin_pos.x + (diff.x / max_dist * projectile->distance_flown) - projectile->cur_pos.x); |
| 1181 | NetItem->set_subpos_y(projectile->origin_pos.y + (diff.y / max_dist * projectile->distance_flown) - projectile->cur_pos.y); |
| 1182 | NetItem->set_subpos_z(projectile->origin_pos.z + (diff.z / max_dist * projectile->distance_flown) - projectile->cur_pos.z); |
| 1183 | NetItem->set_velocity_x(diff.x / max_dist); |
| 1184 | NetItem->set_velocity_y(diff.y / max_dist); |
| 1185 | NetItem->set_velocity_z(diff.z / max_dist); |
| 1186 | } |
| 1187 | } |
| 1188 | for (size_t i = 0; i < world->vehicles.active.size(); i++) |
| 1189 | { |
| 1190 | bool isProj = false; |
| 1191 | auto vehicle = world->vehicles.active[i]; |
| 1192 | for (auto proj = world->projectiles.all.next; proj != NULL; proj = proj->next) |
| 1193 | { |
| 1194 | STRICT_VIRTUAL_CAST_VAR(projectile, df::proj_itemst, proj->item); |
| 1195 | if (!projectile) |
| 1196 | continue; |
| 1197 | if (projectile->item->id == vehicle->item_id) |
| 1198 | { |
| 1199 | isProj = true; |
| 1200 | break; |
| 1201 | } |
| 1202 | } |
| 1203 | if (isProj) |
| 1204 | continue; |
| 1205 | |
| 1206 | auto item = Items::findItemByID(vehicle->item_id); |
| 1207 | if (!item) |
| 1208 | continue; |
| 1209 | auto NetItem = NetBlock->add_items(); |
| 1210 | CopyItem(NetItem, item); |
| 1211 | NetItem->set_subpos_x(vehicle->offset_x / 100000.0); |
| 1212 | NetItem->set_subpos_y(vehicle->offset_y / 100000.0); |
| 1213 | NetItem->set_subpos_z(vehicle->offset_z / 140000.0); |
| 1214 | NetItem->set_velocity_x(vehicle->speed_x / 100000.0); |
no test coverage detected