1 // I N C L U D E S ////////////////////////////////////////////////////////////
2
3 #include "eye_candy_wrapper.h"
4 #ifndef MAP_EDITOR
5 #include "cal.h"
6 #endif
7 #include "cal3d_wrapper.h"
8 #include "client_serv.h" // For mine_type defines
9 #ifndef MAP_EDITOR
10 #include "counters.h"
11 #endif
12 #include "draw_scene.h"
13 #include "elconfig.h"
14 #include "errors.h"
15 #if !defined(MAP_EDITOR)
16 #include "gamewin.h"
17 #endif
18 #include "gl_init.h"
19 #include "map.h"
20 #ifndef MAP_EDITOR
21 #include "missiles.h"
22 #endif
23 #include "particles.h"
24 #include "shadows.h"
25 #ifndef MAP_EDITOR
26 #include "skeletons.h"
27 #endif
28 #include "tiles.h"
29 #include "weather.h"
30
31 // G L O B A L S //////////////////////////////////////////////////////////////
32
33 #ifdef MAP_EDITOR
34 extern int day_shadows_on;
35 ec::SmoothPolygonBoundingRange initial_bounds;
36 #endif
37
38 extern "C"
39 {
40 int use_eye_candy = 1;
41 int use_harvesting_eye_candy = 0;
42 int use_lamp_halo = 0;
43 float min_ec_framerate = 13.0;
44 float max_ec_framerate = 37.0;
45 int light_columns_threshold = 5;
46 int use_fancy_smoke = 1;
47 int max_idle_cycles_per_second = 40;
48 ec_reference harvesting_effect_reference = NULL;
49 }
50
51
52 namespace
53 {
54
55 struct ec_internal_reference
56 {
ec_internal_reference__anon9cf2134e0111::ec_internal_reference57 ec_internal_reference(): effect(nullptr), position(), position2(),
58 #ifndef MAP_EDITOR
59 caster(nullptr), target(nullptr), target_actors(),
60 #endif
61 targets(), bounds(), dead(false), casterbone(), targetbone(), missile_id() {}
62
63 ec::Effect* effect;
64 ec::Vec3 position;
65 ec::Vec3 position2;
66 #ifndef MAP_EDITOR
67 actor* caster;
68 actor* target;
69 std::vector<actor*> target_actors;
70 #endif
71 std::vector<ec::Vec3> targets;
72 ec::SmoothPolygonBoundingRange bounds;
73 bool dead;
74 int casterbone;
75 int targetbone;
76 int missile_id;
77 };
78
79 struct ec_object_obstruction
80 {
81 object3d* obj3d;
82 e3d_object* e3dobj;
83 ec::Vec3 center;
84 float sin_rot_x;
85 float cos_rot_x;
86 float sin_rot_y;
87 float cos_rot_y;
88 float sin_rot_z;
89 float cos_rot_z;
90 float sin_rot_x2;
91 float cos_rot_x2;
92 float sin_rot_y2;
93 float cos_rot_y2;
94 float sin_rot_z2;
95 float cos_rot_z2;
96 bool fire_related;
97 ec::Obstruction* obstruction;
98 };
99 typedef std::vector<ec_object_obstruction*> ec_object_obstructions;
100
101 #ifndef MAP_EDITOR
102 struct ec_actor_obstruction
103 {
104 actor* obstructing_actor;
105 ec::Vec3 center;
106 ec::Obstruction* obstruction;
107 };
108 typedef std::vector<ec_actor_obstruction*> ec_actor_obstructions;
109 #endif
110
111 typedef std::vector<ec::Effect*> ec_internal_effects;
112
113
114 ec::EyeCandy eye_candy;
115 Uint64 ec_cur_time, ec_last_time;
116 std::vector<ec_internal_reference*> references;
117 int idle_cycles_this_second = 0;
118
119 const float MAX_EFFECT_DISTANCE = 16.0;
120 const float MAX_OBSTRUCT_DISTANCE_SQUARED = MAX_EFFECT_DISTANCE * MAX_EFFECT_DISTANCE;
121 const float WALK_RATE = 1.0;
122 const float SWORD_HILT_LENGTH = 0.1;
123 const float SWORD_BLADE_LENGTH = 0.5;
124 const float X_OFFSET = 0.25;
125 const float Y_OFFSET = 0.25;
126
127 ec_object_obstructions object_obstructions;
128 #ifndef MAP_EDITOR
129 ec_actor_obstructions actor_obstructions;
130 ec_actor_obstruction self_actor;
131 #endif
132 std::vector<ec::Obstruction*> general_obstructions_list;
133 std::vector<ec::Obstruction*> fire_obstructions_list;
134 bool force_idle = false;
135 volatile bool idle_semaphore = false;
136
137 float average_framerate = 20000.0; // Windows has such horrible timer resolution, I have to average these out. Anyways, it doesn't hurt to do this in Linux, either.
138
139
ec_heartbeat()140 void ec_heartbeat()
141 {
142 // std::cout << "Actor: <" << camera_x << ", " << camera_z << ", " << -camera_y << ">" << std::endl;
143 // if (!((int)(ec_cur_time / 1000000.0) % 9))
144 // ec_create_breath_fire(44.75, 38.0, 1.0, 44.75, 43.0, 0.6, 2, 1.5);
145 idle_cycles_this_second = 0;
146 general_obstructions_list.clear();
147 fire_obstructions_list.clear();
148 for (auto obstruction: object_obstructions)
149 {
150 obstruction->center.x = obstruction->obj3d->x_pos;
151 obstruction->center.y = obstruction->obj3d->z_pos;
152 obstruction->center.z = -obstruction->obj3d->y_pos;
153 const float dist_squared = (obstruction->center - ec::Vec3(-camera_x, -camera_z, camera_y)).magnitude_squared();
154 if (dist_squared> MAX_OBSTRUCT_DISTANCE_SQUARED)
155 continue;
156 /*
157 obstruction->center.x += X_OFFSET;
158 obstruction->center.y += 0;
159 obstruction->center.z -= Y_OFFSET;
160 */
161 obstruction->sin_rot_x = sin(obstruction->obj3d->x_rot * (ec::PI / 180));
162 obstruction->cos_rot_x = cos(obstruction->obj3d->x_rot * (ec::PI / 180));
163 obstruction->sin_rot_y = sin(obstruction->obj3d->z_rot * (ec::PI / 180));
164 obstruction->cos_rot_y = cos(obstruction->obj3d->z_rot * (ec::PI / 180));
165 obstruction->sin_rot_z = sin(-(obstruction->obj3d->y_rot * (ec::PI / 180)));
166 obstruction->cos_rot_z = cos(-(obstruction->obj3d->y_rot * (ec::PI / 180)));
167 obstruction->sin_rot_x2 = sin(-obstruction->obj3d->x_rot * (ec::PI / 180));
168 obstruction->cos_rot_x2 = cos(-obstruction->obj3d->x_rot * (ec::PI / 180));
169 obstruction->sin_rot_y2 = sin(-obstruction->obj3d->z_rot * (ec::PI / 180));
170 obstruction->cos_rot_y2 = cos(-obstruction->obj3d->z_rot * (ec::PI / 180));
171 obstruction->sin_rot_z2 = sin((obstruction->obj3d->y_rot * (ec::PI / 180)));
172 obstruction->cos_rot_z2 = cos((obstruction->obj3d->y_rot * (ec::PI / 180)));
173 general_obstructions_list.push_back(obstruction->obstruction);
174 if (obstruction->fire_related)
175 fire_obstructions_list.push_back(obstruction->obstruction);
176 }
177 #ifndef MAP_EDITOR
178 for (auto obstruction: actor_obstructions)
179 {
180 obstruction->center.x = obstruction->obstructing_actor->x_pos;
181 obstruction->center.y = ec_get_z(obstruction->obstructing_actor);
182 obstruction->center.z = -obstruction->obstructing_actor->y_pos;
183 const float dist_squared = (obstruction->center - ec::Vec3(-camera_x, -camera_z, camera_y)).magnitude_squared();
184 if (dist_squared> MAX_OBSTRUCT_DISTANCE_SQUARED)
185 continue;
186 obstruction->center.x += X_OFFSET;
187 obstruction->center.y += Y_OFFSET;
188 obstruction->center.z -= 0.25;
189 general_obstructions_list.push_back(obstruction->obstruction);
190 }
191 // Last but not least... the actor.
192 self_actor.center.x = -camera_x;
193 self_actor.center.y = -camera_z;
194 self_actor.center.z = camera_y;
195 general_obstructions_list.push_back(self_actor.obstruction);
196 #endif
197 }
198
ec_in_range(float x,float y,float z,Uint64 effect_max_time)199 int ec_in_range(float x, float y, float z, Uint64 effect_max_time)
200 {
201 float dist_squared = (ec::Vec3(x, z, -y) - ec::Vec3(-camera_x, -camera_z, camera_y)).magnitude_squared();
202 if (dist_squared < ec::square(MAX_EFFECT_DISTANCE + (effect_max_time * WALK_RATE) / 1000000.0))
203 return 1;
204 else
205 return 0;
206 }
207
208 #ifndef MAP_EDITOR
set_vec3_actor_bone(ec::Vec3 & position,actor * _actor,int bone,const ec::Vec3 shift)209 void set_vec3_actor_bone(ec::Vec3& position, actor* _actor, int bone,
210 const ec::Vec3 shift)
211 {
212 float points[1024][3];
213
214 const int num_bones = CalSkeleton_GetBonePoints(
215 CalModel_GetSkeleton(_actor->calmodel), &points[0][0]);
216 if (num_bones <= bone)
217 return;
218
219 ec::Vec3 unrotated_position;
220 unrotated_position.x = points[bone][0] + shift.x;
221 unrotated_position.y = points[bone][1] + shift.z;
222 unrotated_position.z = points[bone][2] - shift.y;
223
224 const float s_rx = sin(_actor->x_rot * (ec::PI / 180));
225 const float c_rx = cos(_actor->x_rot * (ec::PI / 180));
226 const float s_ry = sin(_actor->y_rot * (ec::PI / 180));
227 const float c_ry = cos(_actor->y_rot * (ec::PI / 180));
228 const float s_rz = sin((180 -_actor->z_rot) * (ec::PI / 180));
229 const float c_rz = cos((180 -_actor->z_rot) * (ec::PI / 180));
230
231 ec::Vec3 rotz_position;
232 rotz_position.x = unrotated_position.x * c_rz - unrotated_position.y * s_rz;
233 rotz_position.y = unrotated_position.x * s_rz + unrotated_position.y * c_rz;
234 rotz_position.z = unrotated_position.z;
235
236 ec::Vec3 rotx_position;
237 rotx_position.x = rotz_position.x;
238 rotx_position.y = rotz_position.y * c_rx - rotz_position.z * s_rx;
239 rotx_position.z = rotz_position.y * s_rx + rotz_position.z * c_rx;
240
241 ec::Vec3 roty_position;
242 roty_position.x = rotx_position.z * s_ry + rotx_position.x * c_ry;
243 roty_position.y = rotx_position.y;
244 roty_position.z = rotx_position.z * c_ry - rotx_position.x * s_ry;
245
246 position.x = roty_position.x + _actor->x_pos + X_OFFSET;
247 position.y = roty_position.z + ec_get_z(_actor);
248 position.z = -(roty_position.y + _actor->y_pos + Y_OFFSET);
249 }
250
set_vec3_actor_bone2(ec::Vec3 & position,actor * _actor,int bone,const ec::Vec3 shift)251 void set_vec3_actor_bone2(ec::Vec3& position, actor* _actor, int bone,
252 const ec::Vec3 shift)
253 {
254 float act_rot[9];
255 float tmp_pos[3], pos[3];
256 float _shift[3] = { 0.0, 0.0, 0.0 };
257
258 get_actor_rotation_matrix(_actor, act_rot);
259
260 cal_get_actor_bone_local_position(_actor, bone, _shift, tmp_pos);
261 transform_actor_local_position_to_absolute(_actor, tmp_pos, act_rot, pos);
262 position.x = pos[0] + shift.x;
263 position.y = pos[2] + shift.y;
264 position.z = -pos[1] + shift.z;
265 }
266
set_vec3_actor_bone2(ec::Vec3 & position,actor * _actor,int bone)267 void set_vec3_actor_bone2(ec::Vec3& position, actor* _actor, int bone)
268 {
269 set_vec3_actor_bone2(position, _actor, bone, ec::Vec3(0.0, 0.0, 0.0));
270 }
271
set_vec3_target_bone2(ec::Vec3 & position,actor * _actor,int bone,const ec::Vec3 shift)272 void set_vec3_target_bone2(ec::Vec3& position, actor* _actor, int bone,
273 const ec::Vec3 shift)
274 {
275 set_vec3_actor_bone2(position, _actor, bone, ec::Vec3(0.0, 0.0, 0.0));
276 }
277
set_vec3_target_bone2(ec::Vec3 & position,actor * _actor,int bone)278 void set_vec3_target_bone2(ec::Vec3& position, actor* _actor, int bone)
279 {
280 set_vec3_target_bone2(position, _actor, bone, ec::Vec3(0.0, 0.0, 0.0));
281 }
282
get_sword_positions(actor * _actor,ec::Vec3 & base,ec::Vec3 & tip)283 void get_sword_positions(actor* _actor, ec::Vec3& base, ec::Vec3& tip)
284 {
285 float act_rot[9];
286 float tmp_pos[3], pos[3];
287 float shift[3] =
288 { 0.0, SWORD_HILT_LENGTH, 0.0};
289 int weapon_bone_id = get_actor_bone_id(_actor, weapon_right_bone);
290
291 get_actor_rotation_matrix(_actor, act_rot);
292
293 cal_get_actor_bone_local_position(_actor, weapon_bone_id, shift, tmp_pos);
294 transform_actor_local_position_to_absolute(_actor, tmp_pos, act_rot, pos);
295 base.x = pos[0]; base.y = pos[2]; base.z = -pos[1];
296
297 shift[1] += SWORD_BLADE_LENGTH;
298 cal_get_actor_bone_local_position(_actor, weapon_bone_id, shift, tmp_pos);
299 transform_actor_local_position_to_absolute(_actor, tmp_pos, act_rot, pos);
300 tip.x = pos[0]; tip.y = pos[2]; tip.z = -pos[1];
301 }
302
get_staff_position(actor * _actor,ec::Vec3 & tip)303 void get_staff_position(actor* _actor, ec::Vec3& tip)
304 {
305 float act_rot[9];
306 float tmp_pos[3], pos[3];
307 float shift[3] = { 0.0, 0.45, 0.0 };
308 int weapon_bone_id = get_actor_bone_id(_actor, staff_right_bone);
309
310 get_actor_rotation_matrix(_actor, act_rot);
311
312 cal_get_actor_bone_local_position(_actor, weapon_bone_id, shift, tmp_pos);
313 transform_actor_local_position_to_absolute(_actor, tmp_pos, act_rot, pos);
314 tip.x = pos[0]; tip.y = pos[2]; tip.z = -pos[1];
315 }
316
317 #endif // !MAP_EDITOR
318
319 } // namespace
320
ec_init()321 extern "C" void ec_init()
322 {
323 eye_candy.load_textures();
324 ec_last_time = 0;
325 ec_cur_time = 0;
326 #ifdef MAP_EDITOR
327 ec::SmoothPolygonElement e(0.0, 25.0);
328 initial_bounds.elements.push_back(e);
329 #else
330 self_actor.obstruction = new ec::CappedSimpleCylinderObstruction(&(self_actor.center), 0.45, 3.0, self_actor.center.y, self_actor.center.y + 0.9);
331 #endif
332
333 }
334
ec_add_light(GLenum light_id)335 extern "C" void ec_add_light(GLenum light_id)
336 {
337 eye_candy.add_light(light_id);
338 }
339
ec_get_z2(int x,int y)340 extern "C" float ec_get_z2(int x, int y)
341 {
342 return get_tile_height(x, y);
343 }
344
ec_idle()345 extern "C" void ec_idle()
346 {
347 if (idle_semaphore)
348 return;
349
350 if ((!use_eye_candy) && (!force_idle))
351 return;
352
353 idle_semaphore = true;
354
355 force_idle = false;
356
357 const std::vector<std::string> ec_errors = ec::logger.fetch();
358 for (const auto& error: ec_errors)
359 LOG_ERROR(error.c_str());
360
361 if (ec::get_error_status())
362 {
363 idle_semaphore = false;
364 return;
365 }
366
367 // GLfloat rot_matrix[16];
368 // glGetFloatv(GL_MODELVIEW_MATRIX, rot_matrix);
369 // const float x = rot_matrix[12];
370 // const float y = rot_matrix[13];
371 // const float z = rot_matrix[14];
372
373 if (poor_man)
374 eye_candy.set_thresholds(3500, min_ec_framerate, max_ec_framerate); //Max particles, min framerate, max framerate
375
376 else
377 eye_candy.set_thresholds(15000, min_ec_framerate, max_ec_framerate);
378
379 const float s_rx = sin(rx * ec::PI / 180);
380 const float c_rx = cos(rx * ec::PI / 180);
381 const float s_rz = sin(rz * ec::PI / 180);
382 const float c_rz = cos(rz * ec::PI / 180);
383 float new_camera_x = -zoom_level*camera_distance * s_rx * s_rz + camera_x;
384 float new_camera_y = -zoom_level*camera_distance * s_rx * c_rz + camera_y;
385 float new_camera_z = -zoom_level*camera_distance * c_rx + camera_z;
386 eye_candy.set_camera(ec::Vec3(-new_camera_x, -new_camera_z, new_camera_y));
387 eye_candy.set_center(ec::Vec3(-camera_x, -camera_z, camera_y));
388
389 if ((average_framerate >= light_columns_threshold * 1.15 + 2.5) && (!eye_candy.draw_shapes))
390 eye_candy.draw_shapes = true;
391 else if ((average_framerate < light_columns_threshold / 1.15 - 2.5) && (eye_candy.draw_shapes))
392 eye_candy.draw_shapes = false;
393
394 eye_candy.set_dimensions(window_width, window_height, powf(zoom_level, 0.1));
395
396 Uint64 new_time = ec::get_time();
397 #if defined CLUSTER_INSIDES && !defined MAP_EDITOR
398 short cluster = get_actor_cluster ();
399 #endif
400 for (int i = 0; i < (int)references.size(); )
401 {
402 std::vector<ec_internal_reference*>::iterator iter = references.begin() + i;
403 if ((*iter)->dead)
404 {
405 delete *iter;
406 references.erase(iter);
407 continue;
408 }
409
410 if (use_eye_candy)
411 {
412 #if defined CLUSTER_INSIDES && !defined MAP_EDITOR
413 if ((*iter)->effect && !(*iter)->effect->belongsToCluster (cluster))
414 {
415 (*iter)->effect->active = false;
416 i++;
417 continue;
418 }
419 #endif
420 #ifndef MAP_EDITOR
421 if ((*iter)->caster)
422 {
423 if ((*iter)->effect->get_type() == ec::EC_SWORD)
424 get_sword_positions((*iter)->caster, (*iter)->position, (*iter)->position2);
425 else if ((*iter)->effect->get_type() == ec::EC_STAFF)
426 get_staff_position((*iter)->caster, (*iter)->position);
427 else if ((*iter)->effect->get_type() == ec::EC_TARGETMAGIC)
428 {
429 if ((*iter)->casterbone> -1)
430 {
431 set_vec3_actor_bone2((*iter)->position, (*iter)->caster, (*iter)->casterbone);
432 }
433 else
434 { // use default bone
435 set_vec3_actor_bone2((*iter)->position, (*iter)->caster, get_actor_bone_id((*iter)->caster, head_bone));
436 }
437 }
438 else if ((*iter)->effect->get_type() == ec::EC_GLOW)
439 {
440 if ((*iter)->casterbone> -1)
441 {
442 set_vec3_actor_bone2((*iter)->position, (*iter)->caster, (*iter)->casterbone);
443 }
444 else
445 { // use default bone
446 set_vec3_actor_bone2((*iter)->position, (*iter)->caster, get_actor_bone_id((*iter)->caster, hand_right_bone));
447 }
448 }
449 else
450 {
451 // (*iter)->position = ec::Vec3((*iter)->caster->x_pos + X_OFFSET, ec_get_z((*iter)->caster) - 0.25, -((*iter)->caster->y_pos + Y_OFFSET));
452 // std::cout << "ec_idle: old position: " << (*iter)->position << std::endl;
453 if ((*iter)->casterbone> -1)
454 {
455 set_vec3_actor_bone2((*iter)->position, (*iter)->caster, (*iter)->casterbone);
456 }
457 else
458 { // use default bone
459 set_vec3_actor_bone2((*iter)->position, (*iter)->caster, get_actor_bone_id((*iter)->caster, body_bottom_bone));
460 }
461 // std::cout << "ec_idle: new position: " << (*iter)->position << std::endl;
462 }
463 }
464 if ((*iter)->target)
465 {
466 // (*iter)->position2 = ec::Vec3((*iter)->target->x_pos, ec_get_z((*iter)->target) + 0.4, -(*iter)->target->y_pos);
467 if ((*iter)->targetbone> -1)
468 {
469 set_vec3_target_bone2((*iter)->position2, (*iter)->target, (*iter)->targetbone);
470 }
471 else
472 { // use default bone
473 set_vec3_actor_bone2((*iter)->position2, (*iter)->target, get_actor_bone_id((*iter)->target, body_bottom_bone));
474 }
475 }
476 for (int j = 0; j < (int)(*iter)->target_actors.size(); j++)
477 {
478 if ((*iter)->target_actors[j])
479 {
480 //set_vec3_target_bone2((*iter)->targets[j], (*iter)->target_actors[j], 25);
481 // we do not store target bones for multiple targets, so use default target bone
482 set_vec3_target_bone2((*iter)->targets[j], (*iter)->target_actors[j], get_actor_bone_id((*iter)->target_actors[j], body_bottom_bone));
483 }
484 }
485 #endif //!MAP_EDITOR
486 if ((*iter)->effect && ((*iter)->effect->get_type() == ec::EC_LAMP) && (!(*iter)->effect->recall))
487 {
488 ec::LampEffect* eff = (ec::LampEffect*)((*iter)->effect);
489 if (eff->halo != use_lamp_halo)
490 {
491 ec_create_lamp((*iter)->position.x, -(*iter)->position.z, (*iter)->position.y, 0.0, 1.0, eff->scale, eff->LOD);
492 eff->recall = true;
493 force_idle = true;
494 }
495 }
496 if ((*iter)->effect && (*iter)->effect->get_type() == ec::EC_FOUNTAIN)
497 {
498 ec::FountainEffect* eff = (ec::FountainEffect*)((*iter)->effect);
499 eff->LOD = (poor_man ? 6 : 10);
500 }
501 if ((*iter)->effect && (*iter)->effect->get_type() == ec::EC_SMOKE)
502 {
503 ec::SmokeEffect* eff = (ec::SmokeEffect*)((*iter)->effect);
504 eff->LOD = (poor_man ? 6 : 10);
505 }
506
507 if ((*iter)->effect && (((*iter)->effect->get_type() == ec::EC_CLOUD)
508 || ((*iter)->effect->get_type() == ec::EC_FIREFLY)
509 || ((*iter)->effect->get_type() == ec::EC_WIND)))
510 {
511 #ifndef MAP_EDITOR
512 // doesn't work, moves effects to -2.2 under the ground
513 // (*iter)->position.y = ec_get_z2(-(int)camera_x, -(int)camera_y); // Keep the effect level with the ground.
514 // std::cout << (-(int)camera_x) << ", " << (-(int)camera_y) << ": " << (*iter)->position.y << std::endl;
515 #else //MAP_EDITOR
516 (*iter)->position.y = 0.0;
517 #endif //!MAP_EDITOR
518 }
519 #ifndef MAP_EDITOR
520 if ((*iter)->effect && (*iter)->effect->get_type() == ec::EC_MISSILE)
521 {
522 missile *mis = get_missile_ptr_from_id((*iter)->missile_id);
523 if (mis &&
524 mis->remaining_distance >= 0.0 &&
525 (*iter)->missile_id != -1)
526 {
527 (*iter)->position.x = mis->position[0];
528 (*iter)->position.y = mis->position[2];
529 (*iter)->position.z = -mis->position[1];
530 }
531 }
532 #endif //!MAP_EDITOR
533 }
534 i++;
535 }
536 if (is_day)
537 eye_candy.use_lights = false;
538 else
539 eye_candy.use_lights = true;
540
541 if (ec_cur_time == 0)
542 eye_candy.time_diff = 100000;
543 else
544 eye_candy.time_diff = new_time - ec_cur_time;
545 if (eye_candy.time_diff> 400000) // Don't want it to jump if it's been very long between frames.
546 eye_candy.time_diff = 400000;
547 // average_framerate = average_framerate * 0.7 + 1000000.0 / eye_candy.time_diff * 0.3;
548 #ifndef MAP_EDITOR
549 average_framerate = fps_average;
550 #endif //!MAP_EDITOR
551 eye_candy.framerate = average_framerate;
552 ec_last_time = ec_cur_time;
553 ec_cur_time = new_time;
554
555 eye_candy.max_fps = (max_fps ? max_fps : 255);
556
557 if (use_eye_candy && ec_last_time % 1000000 >= ec_cur_time % 1000000)
558 ec_heartbeat();
559
560 #if 0
561 // Put debugging effects here.
562 if (ec_last_time % 100000 >= ec_cur_time % 100000)
563 {
564 float test_x = 31.0 + ec::randfloat(6.0);
565 float test_y = 36.0 + ec::randfloat(6.0);
566 if (rand() & 1)
567 ec_create_bag_pickup(test_x, test_y, 0.0, 10);
568 else
569 ec_create_bag_drop(test_x, test_y, 0.0, 10);
570 }
571 #endif
572
573 if ((unsigned int)(ec::get_time() % 1000000) >= (unsigned int)(1000000 * idle_cycles_this_second / max_idle_cycles_per_second))
574 {
575 eye_candy.idle();
576 idle_cycles_this_second++;
577 }
578
579 idle_semaphore = false;
580 }
581
ec_draw()582 extern "C" void ec_draw()
583 {
584 if (ec::get_error_status())
585 return;
586
587 if (use_eye_candy)
588 {
589 #if defined CLUSTER_INSIDES && !defined MAP_EDITOR
590 short cluster = get_actor_cluster ();
591 #endif
592
593 // Update firefly activity.
594 for (int i = 0; i < (int)references.size(); )
595 {
596 std::vector<ec_internal_reference*>::iterator iter = references.begin() + i;
597 if ((*iter)->dead)
598 {
599 delete *iter;
600 references.erase(iter);
601 continue;
602 }
603
604 #ifdef MAP_EDITOR
605 // if ((*iter)->effect->get_type() == ec::EC_FIREFLY)
606 // (*iter)->effect->active = (!day_shadows_on);
607 #else
608 if ((*iter)->effect && (*iter)->effect->get_type() == ec::EC_FIREFLY
609 #ifdef CLUSTER_INSIDES
610 && (*iter)->effect->belongsToCluster (cluster)
611 #endif
612 )
613 {
614 (*iter)->effect->active = (!(is_day || dungeon
615 || (weather_get_density() > 0.01f)
616 ));
617 }
618 #endif
619 i++;
620 }
621
622 glPushMatrix();
623 glRotatef(90, 1.0, 0.0, 0.0);
624 eye_candy.draw();
625 glPopMatrix();
626 }
627 }
628
ec_recall_effect(const ec_reference ref)629 extern "C" void ec_recall_effect(const ec_reference ref)
630 {
631 force_idle = true;
632 if (ref != NULL)
633 {
634 ec_internal_reference* cast_reference = (ec_internal_reference*)ref;
635 if (cast_reference != NULL
636 && cast_reference->effect != NULL)
637 {
638 cast_reference->effect->recall = true;
639 }
640 }
641 }
642
ec_destroy_all_effects()643 extern "C" void ec_destroy_all_effects()
644 {
645 // loop marking all active effects as done, cleaning up the dead till we're done
646 for (int i=0; !references.empty() && i<50; ++i)
647 {
648 ec_delete_all_effects();
649 ec_idle();
650 }
651 if (!references.empty()) // unlikely to happen but just so we don't get stick on exit.
652 LOG_ERROR("%s: failed to clear up. references.size()=%lu", __PRETTY_FUNCTION__, references.size());
653 #ifndef MAP_EDITOR
654 delete self_actor.obstruction;
655 #endif
656 }
657
658
ec_delete_all_effects()659 extern "C" void ec_delete_all_effects()
660 {
661 force_idle = true;
662 for (int i = 0; i < (int)references.size(); )
663 {
664 std::vector<ec_internal_reference*>::iterator iter = references.begin() + i;
665 if ((*iter)->dead)
666 {
667 delete *iter;
668 references.erase(iter);
669 continue;
670 }
671
672 if ((*iter)->effect)
673 (*iter)->effect->recall = true;
674 i++;
675 }
676 }
677
ec_delete_effect_loc_type(float x,float y,ec_EffectEnum type)678 extern "C" void ec_delete_effect_loc_type(float x, float y, ec_EffectEnum type)
679 {
680 force_idle = true;
681 for (int i = 0; i < (int)references.size(); )
682 {
683 std::vector<ec_internal_reference*>::iterator iter = references.begin() + i;
684 if ((*iter)->dead)
685 {
686 delete *iter;
687 references.erase(iter);
688 continue;
689 }
690
691 i++;
692 if (((*iter)->position.x == x) && ((*iter)->position.z == -y) && (type == (ec_EffectEnum)(*iter)->effect->get_type()))
693 {
694 (*iter)->effect->recall = true;
695 continue;
696 }
697 }
698 }
699
ec_delete_effect_type(ec_EffectEnum type)700 extern "C" void ec_delete_effect_type(ec_EffectEnum type)
701 {
702 force_idle = true;
703 for (int i = 0; i < (int)references.size(); )
704 {
705 std::vector<ec_internal_reference*>::iterator iter = references.begin() + i;
706 if ((*iter)->dead)
707 {
708 delete *iter;
709 references.erase(iter);
710 continue;
711 }
712
713 i++;
714 if (type == (ec_EffectEnum)(*iter)->effect->get_type())
715 {
716 (*iter)->effect->recall = true;
717 continue;
718 }
719 }
720 }
721
ec_set_position(ec_reference ref,float x,float y,float z)722 extern "C" void ec_set_position(ec_reference ref, float x, float y, float z)
723 {
724 ((ec_internal_reference*)ref)->position = ec::Vec3(x, z, -y);
725 }
726
ec_add_object_obstruction(object3d * obj3d,e3d_object * e3dobj,float force)727 extern "C" void ec_add_object_obstruction(object3d* obj3d, e3d_object *e3dobj, float force)
728 {
729 // First, verify that this object isn't "flat"
730 if ((e3dobj->min_x == e3dobj->max_x) || (e3dobj->min_y == e3dobj->max_y) || (e3dobj->min_z == e3dobj->max_z))
731 return;
732
733 ec_object_obstruction* obstruction = new ec_object_obstruction;
734 obstruction->obj3d = obj3d;
735 obstruction->e3dobj = e3dobj;
736 obstruction->center = ec::Vec3(obj3d->x_pos, obj3d->z_pos - 0.5, -(obj3d->y_pos));
737 obstruction->sin_rot_x = sin(obj3d->x_rot * (ec::PI / 180));
738 obstruction->cos_rot_x = cos(obj3d->x_rot * (ec::PI / 180));
739 obstruction->sin_rot_y = sin(obj3d->z_rot * (ec::PI / 180));
740 obstruction->cos_rot_y = cos(obj3d->z_rot * (ec::PI / 180));
741 obstruction->sin_rot_z = sin(-(obj3d->y_rot * (ec::PI / 180)));
742 obstruction->cos_rot_z = cos(-(obj3d->y_rot * (ec::PI / 180)));
743 obstruction->sin_rot_x2 = sin(-obj3d->x_rot * (ec::PI / 180));
744 obstruction->cos_rot_x2 = cos(-obj3d->x_rot * (ec::PI / 180));
745 obstruction->sin_rot_y2 = sin(-obj3d->z_rot * (ec::PI / 180));
746 obstruction->cos_rot_y2 = cos(-obj3d->z_rot * (ec::PI / 180));
747 obstruction->sin_rot_z2 = sin((obj3d->y_rot * (ec::PI / 180)));
748 obstruction->cos_rot_z2 = cos((obj3d->y_rot * (ec::PI / 180)));
749 obstruction->fire_related = false;
750 if (!strncmp(obj3d->file_name + 2, "misc_ob", 7))
751 {
752 if (!strncmp(obj3d->file_name + 15, "cook", 4) ||
753 !strncmp(obj3d->file_name + 15, "pot_", 4) ||
754 !strncmp(obj3d->file_name + 15, "cauld", 5))
755 obstruction->fire_related = true;
756 }
757 else if (!strncmp(obj3d->file_name + 2, "struc", 5))
758 {
759 if (!strncmp(obj3d->file_name + 13, "chimn", 5) ||
760 !strncmp(obj3d->file_name + 13, "forge", 5))
761 obstruction->fire_related = true;
762 }
763 else if (!strncmp(obj3d->file_name + 2, "trees/fire", 10))
764 obstruction->fire_related = true;
765 obstruction->obstruction = new ec::BoxObstruction(ec::Vec3(e3dobj->min_x, e3dobj->min_z, -e3dobj->max_y), ec::Vec3(e3dobj->max_x, e3dobj->max_z, -e3dobj->min_y), &(obstruction->center), &(obstruction->sin_rot_x), &(obstruction->cos_rot_x), &(obstruction->sin_rot_y), &(obstruction->cos_rot_y), &(obstruction->sin_rot_z), &(obstruction->cos_rot_z), &(obstruction->sin_rot_x2), &(obstruction->cos_rot_x2), &(obstruction->sin_rot_y2), &(obstruction->cos_rot_y2), &(obstruction->sin_rot_z2), &(obstruction->cos_rot_z2), force);
766 object_obstructions.push_back(obstruction);
767 }
768
ec_remove_obstruction_by_object3d(object3d * obj3d)769 extern "C" void ec_remove_obstruction_by_object3d(object3d* obj3d)
770 {
771 for (ec_object_obstructions::iterator iter = object_obstructions.begin(); iter != object_obstructions.end(); ++iter)
772 {
773 if ((*iter)->obj3d == obj3d)
774 {
775 for (std::vector<ec::Obstruction*>::iterator iter2 = general_obstructions_list.begin(); iter2 != general_obstructions_list.end(); ++iter2)
776 {
777 if (*iter2 == (*iter)->obstruction)
778 {
779 general_obstructions_list.erase(iter2);
780 break;
781 }
782 }
783 for (std::vector<ec::Obstruction*>::iterator iter2 = fire_obstructions_list.begin(); iter2 != fire_obstructions_list.end(); ++iter2)
784 {
785 if (*iter2 == (*iter)->obstruction)
786 {
787 fire_obstructions_list.erase(iter2);
788 break;
789 }
790 }
791 delete (*iter)->obstruction;
792 delete *iter;
793 object_obstructions.erase(iter);
794 return;
795 }
796 }
797 }
798
ec_remove_obstruction_by_e3d_object(e3d_object * e3dobj)799 extern "C" void ec_remove_obstruction_by_e3d_object(e3d_object* e3dobj)
800 {
801 for (ec_object_obstructions::iterator iter = object_obstructions.begin(); iter != object_obstructions.end(); ++iter)
802 {
803 if ((*iter)->e3dobj == e3dobj)
804 {
805 for (std::vector<ec::Obstruction*>::iterator iter2 = general_obstructions_list.begin(); iter2 != general_obstructions_list.end(); ++iter2)
806 {
807 if (*iter2 == (*iter)->obstruction)
808 {
809 general_obstructions_list.erase(iter2);
810 break;
811 }
812 }
813 for (std::vector<ec::Obstruction*>::iterator iter2 = fire_obstructions_list.begin(); iter2 != fire_obstructions_list.end(); ++iter2)
814 {
815 if (*iter2 == (*iter)->obstruction)
816 {
817 fire_obstructions_list.erase(iter2);
818 break;
819 }
820 }
821 delete (*iter)->obstruction;
822 delete *iter;
823 object_obstructions.erase(iter);
824 return;
825 }
826 }
827 }
828
ec_create_bounds_list()829 extern "C" ec_bounds ec_create_bounds_list()
830 {
831 return (ec_bounds)(new ec::SmoothPolygonBoundingRange());
832 }
833
ec_free_bounds_list(ec_bounds bounds)834 extern "C" void ec_free_bounds_list(ec_bounds bounds)
835 {
836 ec::SmoothPolygonBoundingRange* cast_bounds = (ec::SmoothPolygonBoundingRange*)bounds;
837 delete cast_bounds;
838 }
839
ec_add_smooth_polygon_bound(ec_bounds bounds,float angle,float radius)840 extern "C" void ec_add_smooth_polygon_bound(ec_bounds bounds, float angle, float radius)
841 {
842 ec::SmoothPolygonBoundingRange* cast_bounds = (ec::SmoothPolygonBoundingRange*)bounds;
843 ec::SmoothPolygonElement e(angle, radius);
844 cast_bounds->elements.push_back(e);
845 }
846
ec_create_generic()847 extern "C" ec_reference ec_create_generic()
848 {
849 references.push_back(new ec_internal_reference);
850 ((ec_internal_reference*)(ec_reference)(references[references.size() - 1]))->casterbone = -1;
851 ((ec_internal_reference*)(ec_reference)(references[references.size() - 1]))->targetbone = -1;
852 return (ec_reference)(references[references.size() - 1]);
853 }
854
ec_add_target(ec_reference reference,float x,float y,float z)855 extern "C" void ec_add_target(ec_reference reference, float x, float y, float z)
856 {
857 ec_internal_reference* cast_reference = (ec_internal_reference*)reference;
858 ec::Vec3 target(x, z, -y);
859 cast_reference->targets.push_back(target);
860 }
861
ec_create_effect_from_map_code(char * code,float x,float y,float z,int LOD)862 extern "C" ec_reference ec_create_effect_from_map_code(char* code, float x, float y, float z, int LOD)
863 {
864 unsigned char raw_code[54];
865 unsigned char const * const code2 = reinterpret_cast<unsigned char const *>(code);
866 int i = 0;
867
868 while (i < 18)
869 {
870 raw_code[i * 3] = ((code2[i * 4 + 0] - ' ') >> 0) | ((code2[i * 4 + 1] - ' ') << 6);
871 raw_code[i * 3 + 1] = ((code2[i * 4 + 1] - ' ') >> 2) | ((code2[i * 4 + 2] - ' ') << 4);
872 raw_code[i * 3 + 2] = ((code2[i * 4 + 2] - ' ') >> 4) | ((code2[i * 4 + 3] - ' ') << 2);
873 i++;
874 }
875
876 int bounds_count = raw_code[1];
877 if (bounds_count> 19)
878 bounds_count = 19;
879 ec_bounds bounds = ec_create_bounds_list();
880 for (i = 0; i < bounds_count; i++)
881 ec_add_smooth_polygon_bound(bounds, raw_code[i * 2 + 2] * (2 * ec::PI) / 256.0f, raw_code[i * 2 + 3]);
882 ec_reference ref = NULL;
883
884 switch (raw_code[0])
885 {
886 case 0x00: // Campfire
887
888 {
889 const float hue = raw_code[41] / 256.0;
890 const float saturation = raw_code[42] / 16.0;
891 const float scale = raw_code[43] + raw_code[44] / 256.0;
892 ref = ec_create_campfire(x, y, z, hue, saturation, LOD, scale);
893 break;
894 }
895 case 0x01: // Cloud
896
897 {
898 const float hue = raw_code[41] / 256.0;
899 const float saturation = raw_code[42] / 16.0;
900 const float density = raw_code[43] + raw_code[44] / 256.0;
901 ref = ec_create_cloud(x, y, z, hue, saturation, density, bounds, LOD);
902 break;
903 }
904 case 0x02: // Fireflies
905
906 {
907 const float hue = raw_code[41] / 256.0;
908 const float saturation = raw_code[42] / 16.0;
909 const float density = raw_code[43] + raw_code[44] / 256.0;
910 const float scale = raw_code[45] + raw_code[46] / 256.0;
911 ref = ec_create_fireflies(x, y, z, hue, saturation, density, scale, bounds);
912 break;
913 }
914 case 0x03: // Fountain
915
916 {
917 const float hue = raw_code[41] / 256.0;
918 const float saturation = raw_code[42] / 16.0;
919 const float scale = raw_code[43] + raw_code[44] / 256.0;
920 const float base_height = raw_code[45] * 8.0 + raw_code[46] / 32.0;
921 const int backlit = raw_code[47];
922 ref = ec_create_fountain(x, y, z, hue, saturation, base_height, backlit, scale, LOD);
923 break;
924 }
925 case 0x04: // Lamp
926
927 {
928 const float hue = raw_code[41] / 256.0;
929 const float saturation = raw_code[42] / 16.0;
930 const float scale = raw_code[43] + raw_code[44] / 256.0;
931 ref = ec_create_lamp(x, y, z, hue, saturation, scale, LOD);
932 break;
933 }
934 case 0x05: // Magic protection
935
936 {
937 const float hue = raw_code[41] / 256.0;
938 const float saturation = raw_code[42] / 16.0;
939 const float scale = raw_code[43] + raw_code[44] / 256.0;
940 ref = ec_create_ongoing_magic_protection(x, y, z, hue, saturation, LOD, scale);
941 break;
942 }
943 case 0x06: // Shield
944
945 {
946 const float hue = raw_code[41] / 256.0;
947 const float saturation = raw_code[42] / 16.0;
948 const float scale = raw_code[43] + raw_code[44] / 256.0;
949 ref = ec_create_ongoing_shield(x, y, z, hue, saturation, LOD, scale);
950 break;
951 }
952 case 0x07: // Magic immunity
953
954 {
955 const float hue = raw_code[41] / 256.0;
956 const float saturation = raw_code[42] / 16.0;
957 const float scale = raw_code[43] + raw_code[44] / 256.0;
958 ref = ec_create_ongoing_magic_immunity(x, y, z, hue, saturation, LOD, scale);
959 break;
960 }
961 case 0x08: // Poison
962
963 {
964 const float hue = raw_code[41] / 256.0;
965 const float saturation = raw_code[42] / 16.0;
966 const float scale = raw_code[43] + raw_code[44] / 256.0;
967 ref = ec_create_ongoing_poison(x, y, z, hue, saturation, LOD, scale);
968 break;
969 }
970 case 0x09: // Smoke
971
972 {
973 const float hue = raw_code[41] / 256.0;
974 const float saturation = raw_code[42] / 16.0;
975 const float density = raw_code[43] + raw_code[44] / 256.0;
976 ref = ec_create_smoke(x, y, z, hue, saturation, density, LOD);
977 break;
978 }
979 case 0x0A: // Teleporter
980
981 {
982 const float hue = raw_code[41] / 256.0;
983 const float saturation = raw_code[42] / 16.0;
984 const float scale = raw_code[43] + raw_code[44] / 256.0;
985 ref = ec_create_teleporter(x, y, z, hue, saturation, scale, LOD);
986 break;
987 }
988 case 0x0B: // Leaves
989
990 {
991 const float hue = raw_code[41] / 256.0;
992 const float saturation = raw_code[42] / 16.0;
993 const float density = raw_code[43] + raw_code[44] / 256.0;
994 const float scale = raw_code[45] + raw_code[46] / 256.0;
995 ref = ec_create_wind_leaves(x, y, z, hue, saturation, scale, density, bounds, 1.0, 0.0, 0.0);
996 break;
997 }
998 case 0x0C: // Petals
999
1000 {
1001 const float hue = raw_code[41] / 256.0;
1002 const float saturation = raw_code[42] / 16.0;
1003 const float density = raw_code[43] + raw_code[44] / 256.0;
1004 const float scale = raw_code[45] + raw_code[46] / 256.0;
1005 ref = ec_create_wind_petals(x, y, z, hue, saturation, scale, density, bounds, 1.0, 0.0, 0.0);
1006 break;
1007 }
1008 case 0x0D: // Waterfall
1009
1010 {
1011 // const float hue = raw_code[41] / 256.0;
1012 // const float saturation = raw_code[42] / 16.0;
1013 // const float density = raw_code[43] + raw_code[44] / 256.0;
1014 // const float base_height = raw_code[45] * 8.0 + raw_code[46] / 32.0;
1015 // const float angle = raw_code[47] * ec::PI / 128.0;
1016 // Effect does not yet exist.
1017 break;
1018 }
1019 case 0x0E: // Bees
1020
1021 {
1022 // const float hue = raw_code[41] / 256.0;
1023 // const float saturation = raw_code[42] / 16.0;
1024 // const float density = raw_code[43] + raw_code[44] / 256.0;
1025 // const float scale = raw_code[45] + raw_code[46] / 256.0;
1026 // Effect does not yet exist.
1027 break;
1028 }
1029 case 0x0F: // Portal
1030
1031 {
1032 // const float hue = raw_code[41] / 256.0;
1033 // const float saturation = raw_code[42] / 16.0;
1034 // const float scale = raw_code[43] + raw_code[44] / 256.0;
1035 // const float angle = raw_code[45] * ec::PI / 128.0;
1036 // Effect does not yet exist.
1037 break;
1038 }
1039 case 0x10: // Candle
1040
1041 {
1042 const float hue = raw_code[41] / 256.0;
1043 const float saturation = raw_code[42] / 16.0;
1044 const float scale = raw_code[43] + raw_code[44] / 256.0;
1045 ref = ec_create_candle(x, y, z, hue, saturation, scale, LOD);
1046 break;
1047 }
1048 }
1049 ec_free_bounds_list(bounds);
1050 return ref;
1051 }
1052
ec_create_bag_pickup(float x,float y,float z,int LOD)1053 extern "C" ec_reference ec_create_bag_pickup(float x, float y, float z, int LOD)
1054 {
1055 if (!ec_in_range(x, y, z, ec::BagEffect::get_max_end_time()))
1056 return NULL;
1057 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1058 ret->position = ec::Vec3(x, z, -y);
1059 ret->effect = new ec::BagEffect(&eye_candy, &ret->dead, &ret->position, true, LOD);
1060 eye_candy.push_back_effect(ret->effect);
1061 return (ec_reference)ret;
1062 }
1063
ec_create_bag_drop(float x,float y,float z,int LOD)1064 extern "C" ec_reference ec_create_bag_drop(float x, float y, float z, int LOD)
1065 {
1066 if (!ec_in_range(x, y, z, ec::BagEffect::get_max_end_time()))
1067 return NULL;
1068 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1069 ret->position = ec::Vec3(x, z, -y);
1070 ret->effect = new ec::BagEffect(&eye_candy, &ret->dead, &ret->position, false, LOD);
1071 eye_candy.push_back_effect(ret->effect);
1072 return (ec_reference)ret;
1073 }
1074
ec_create_breath_fire(float sx,float sy,float sz,float tx,float ty,float tz,int LOD,float scale)1075 extern "C" ec_reference ec_create_breath_fire(float sx, float sy, float sz, float tx, float ty, float tz, int LOD, float scale)
1076 {
1077 if (!ec_in_range(sx, sy, sz, ec::BreathEffect::get_max_end_time()))
1078 return NULL;
1079 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1080 ret->position = ec::Vec3(sx, sz, -(sy + X_OFFSET));
1081 ret->position2 = ec::Vec3(tx, tz, -(ty + Y_OFFSET));
1082 ret->effect = new ec::BreathEffect(&eye_candy, &ret->dead, &ret->position, &ret->position2, &general_obstructions_list, ec::BreathEffect::FIRE, LOD, scale);
1083 eye_candy.push_back_effect(ret->effect);
1084 return (ec_reference)ret;
1085 }
1086
ec_create_breath_ice(float sx,float sy,float sz,float tx,float ty,float tz,int LOD,float scale)1087 extern "C" ec_reference ec_create_breath_ice(float sx, float sy, float sz, float tx, float ty, float tz, int LOD, float scale)
1088 {
1089 if (!ec_in_range(sx, sy, sz, ec::BreathEffect::get_max_end_time()))
1090 return NULL;
1091 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1092 ret->position = ec::Vec3(sx, sz, -(sy + X_OFFSET));
1093 ret->position2 = ec::Vec3(tx, tz, -(ty + Y_OFFSET));
1094 ret->effect = new ec::BreathEffect(&eye_candy, &ret->dead, &ret->position, &ret->position2, &general_obstructions_list, ec::BreathEffect::ICE, LOD, scale);
1095 eye_candy.push_back_effect(ret->effect);
1096 return (ec_reference)ret;
1097 }
1098
ec_create_breath_poison(float sx,float sy,float sz,float tx,float ty,float tz,int LOD,float scale)1099 extern "C" ec_reference ec_create_breath_poison(float sx, float sy, float sz, float tx, float ty, float tz, int LOD, float scale)
1100 {
1101 if (!ec_in_range(sx, sy, sz, ec::BreathEffect::get_max_end_time()))
1102 return NULL;
1103 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1104 ret->position = ec::Vec3(sx, sz, -(sy + X_OFFSET));
1105 ret->position2 = ec::Vec3(tx, tz, -(ty + Y_OFFSET));
1106 ret->effect = new ec::BreathEffect(&eye_candy, &ret->dead, &ret->position, &ret->position2, &general_obstructions_list, ec::BreathEffect::POISON, LOD, scale);
1107 eye_candy.push_back_effect(ret->effect);
1108 return (ec_reference)ret;
1109 }
1110
ec_create_breath_magic(float sx,float sy,float sz,float tx,float ty,float tz,int LOD,float scale)1111 extern "C" ec_reference ec_create_breath_magic(float sx, float sy, float sz, float tx, float ty, float tz, int LOD, float scale)
1112 {
1113 if (!ec_in_range(sx, sy, sz, ec::BreathEffect::get_max_end_time()))
1114 return NULL;
1115 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1116 ret->position = ec::Vec3(sx, sz, -(sy + X_OFFSET));
1117 ret->position2 = ec::Vec3(tx, tz, -(ty + Y_OFFSET));
1118 ret->effect = new ec::BreathEffect(&eye_candy, &ret->dead, &ret->position, &ret->position2, &general_obstructions_list, ec::BreathEffect::MAGIC, LOD, scale);
1119 eye_candy.push_back_effect(ret->effect);
1120 return (ec_reference)ret;
1121 }
1122
ec_create_breath_lightning(float sx,float sy,float sz,float tx,float ty,float tz,int LOD,float scale)1123 extern "C" ec_reference ec_create_breath_lightning(float sx, float sy, float sz, float tx, float ty, float tz, int LOD, float scale)
1124 {
1125 if (!ec_in_range(sx, sy, sz, ec::BreathEffect::get_max_end_time()))
1126 return NULL;
1127 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1128 ret->position = ec::Vec3(sx, sz, -(sy + X_OFFSET));
1129 ret->position2 = ec::Vec3(tx, tz, -(ty + Y_OFFSET));
1130 ret->effect = new ec::BreathEffect(&eye_candy, &ret->dead, &ret->position, &ret->position2, &general_obstructions_list, ec::BreathEffect::LIGHTNING, LOD, scale);
1131 eye_candy.push_back_effect(ret->effect);
1132 return (ec_reference)ret;
1133 }
1134
ec_create_breath_wind(float sx,float sy,float sz,float tx,float ty,float tz,int LOD,float scale)1135 extern "C" ec_reference ec_create_breath_wind(float sx, float sy, float sz, float tx, float ty, float tz, int LOD, float scale)
1136 {
1137 if (!ec_in_range(sx, sy, sz, ec::BreathEffect::get_max_end_time()))
1138 return NULL;
1139 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1140 ret->position = ec::Vec3(sx, sz, -(sy + X_OFFSET));
1141 ret->position2 = ec::Vec3(tx, tz, -(ty + Y_OFFSET));
1142 ret->effect = new ec::BreathEffect(&eye_candy, &ret->dead, &ret->position, &ret->position2, &general_obstructions_list, ec::BreathEffect::WIND, LOD, scale);
1143 eye_candy.push_back_effect(ret->effect);
1144 return (ec_reference)ret;
1145 }
1146
ec_create_campfire(float x,float y,float z,float hue_adjust,float saturation_adjust,int LOD,float scale)1147 extern "C" ec_reference ec_create_campfire(float x, float y, float z, float hue_adjust, float saturation_adjust, int LOD, float scale)
1148 {
1149 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1150 ret->position = ec::Vec3(x, z, -y);
1151 ret->effect = new ec::CampfireEffect(&eye_candy, &ret->dead, &ret->position, &fire_obstructions_list, hue_adjust, saturation_adjust, scale, LOD);
1152 eye_candy.push_back_effect(ret->effect);
1153 return (ec_reference)ret;
1154 }
1155
ec_create_cloud(float x,float y,float z,float hue_adjust,float saturation_adjust,float density,ec_bounds bounds,int LOD)1156 extern "C" ec_reference ec_create_cloud(float x, float y, float z, float hue_adjust, float saturation_adjust, float density, ec_bounds bounds, int LOD)
1157 {
1158 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1159 ret->bounds = *(ec::SmoothPolygonBoundingRange*)bounds;
1160 ret->position = ec::Vec3(x, z, -y);
1161 ret->effect = new ec::CloudEffect(&eye_candy, &ret->dead, &ret->position, hue_adjust, saturation_adjust, density, &ret->bounds, LOD);
1162 eye_candy.push_back_effect(ret->effect);
1163 return (ec_reference)ret;
1164 }
1165
ec_create_fireflies(float x,float y,float z,float hue_adjust,float saturation_adjust,float density,float scale,ec_bounds bounds)1166 extern "C" ec_reference ec_create_fireflies(float x, float y, float z, float hue_adjust, float saturation_adjust, float density, float scale, ec_bounds bounds)
1167 {
1168 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1169 ret->bounds = *(ec::SmoothPolygonBoundingRange*)bounds;
1170 ret->position = ec::Vec3(x, z, -y);
1171 ret->effect = new ec::FireflyEffect(&eye_candy, &ret->dead, &ret->position, &general_obstructions_list, hue_adjust, saturation_adjust, density, scale, &ret->bounds);
1172 eye_candy.push_back_effect(ret->effect);
1173 return (ec_reference)ret;
1174 }
1175
ec_create_fountain(float x,float y,float z,float hue_adjust,float saturation_adjust,float base_height,int backlit,float scale,int LOD)1176 extern "C" ec_reference ec_create_fountain(float x, float y, float z, float hue_adjust, float saturation_adjust, float base_height, int backlit, float scale, int LOD)
1177 {
1178 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1179 ret->position = ec::Vec3(x, z, -y);
1180 ret->effect = new ec::FountainEffect(&eye_candy, &ret->dead, &ret->position, hue_adjust, saturation_adjust, (bool)backlit, base_height, scale, LOD);
1181 eye_candy.push_back_effect(ret->effect);
1182 return (ec_reference)ret;
1183 }
1184
ec_create_harvesting_radon_pouch(float x,float y,float z,int LOD)1185 extern "C" ec_reference ec_create_harvesting_radon_pouch(float x, float y, float z, int LOD)
1186 {
1187 if (!ec_in_range(x, y, z, ec::HarvestingEffect::get_max_end_time()))
1188 return NULL;
1189 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1190 ret->position = ec::Vec3(x, z, -y);
1191 ret->effect = new ec::HarvestingEffect(&eye_candy, &ret->dead, &ret->position, ec::HarvestingEffect::RADON_POUCH, LOD);
1192 eye_candy.push_back_effect(ret->effect);
1193 return (ec_reference)ret;
1194 }
1195
ec_create_harvesting_cavern_wall(float x,float y,float z,int LOD)1196 extern "C" ec_reference ec_create_harvesting_cavern_wall(float x, float y, float z, int LOD)
1197 {
1198 if (!ec_in_range(x, y, z, ec::HarvestingEffect::get_max_end_time()))
1199 return NULL;
1200 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1201 ret->position = ec::Vec3(x, z, -y);
1202 ret->effect = new ec::HarvestingEffect(&eye_candy, &ret->dead, &ret->position, ec::HarvestingEffect::CAVERN_WALL, LOD);
1203 eye_candy.push_back_effect(ret->effect);
1204 return (ec_reference)ret;
1205 }
1206
ec_create_harvesting_mother_nature(float x,float y,float z,int LOD)1207 extern "C" ec_reference ec_create_harvesting_mother_nature(float x, float y, float z, int LOD)
1208 {
1209 if (!ec_in_range(x, y, z, ec::HarvestingEffect::get_max_end_time()))
1210 return NULL;
1211 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1212 ret->position = ec::Vec3(x, z, -y);
1213 ret->effect = new ec::HarvestingEffect(&eye_candy, &ret->dead, &ret->position, ec::HarvestingEffect::MOTHER_NATURE, LOD);
1214 eye_candy.push_back_effect(ret->effect);
1215 return (ec_reference)ret;
1216 }
1217
ec_create_harvesting_queen_of_nature(float x,float y,float z,int LOD)1218 extern "C" ec_reference ec_create_harvesting_queen_of_nature(float x, float y, float z, int LOD)
1219 {
1220 if (!ec_in_range(x, y, z, ec::HarvestingEffect::get_max_end_time()))
1221 return NULL;
1222 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1223 ret->position = ec::Vec3(x, z, -y);
1224 ret->effect = new ec::HarvestingEffect(&eye_candy, &ret->dead, &ret->position, ec::HarvestingEffect::QUEEN_OF_NATURE, LOD);
1225 eye_candy.push_back_effect(ret->effect);
1226 return (ec_reference)ret;
1227 }
1228
ec_create_harvesting_bees(float x,float y,float z,int LOD)1229 extern "C" ec_reference ec_create_harvesting_bees(float x, float y, float z, int LOD)
1230 {
1231 if (!ec_in_range(x, y, z, ec::HarvestingEffect::get_max_end_time()))
1232 return NULL;
1233 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1234 ret->position = ec::Vec3(x, z, -y);
1235 ret->effect = new ec::HarvestingEffect(&eye_candy, &ret->dead, &ret->position, ec::HarvestingEffect::BEES, LOD);
1236 eye_candy.push_back_effect(ret->effect);
1237 return (ec_reference)ret;
1238 }
1239
ec_create_impact_magic_protection(float x,float y,float z,float angle_x,float angle_y,float angle_z,int LOD,float strength)1240 extern "C" ec_reference ec_create_impact_magic_protection(float x, float y, float z, float angle_x, float angle_y, float angle_z, int LOD, float strength)
1241 {
1242 if (!ec_in_range(x, y, z, ec::ImpactEffect::get_max_end_time()))
1243 return NULL;
1244 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1245 ret->position = ec::Vec3(x, z, -y);
1246 ec::Vec3 angle_vec(angle_x, angle_z, -angle_y);
1247 ret->position -= angle_vec;
1248 angle_vec.normalize(0.4);
1249 ret->effect = new ec::ImpactEffect(&eye_candy, &ret->dead, &ret->position, angle_vec, ec::ImpactEffect::MAGIC_PROTECTION, LOD, strength);
1250 eye_candy.push_back_effect(ret->effect);
1251 return (ec_reference)ret;
1252 }
1253
ec_create_impact_shield(float x,float y,float z,float angle_x,float angle_y,float angle_z,int LOD,float strength)1254 extern "C" ec_reference ec_create_impact_shield(float x, float y, float z, float angle_x, float angle_y, float angle_z, int LOD, float strength)
1255 {
1256 if (!ec_in_range(x, y, z, ec::ImpactEffect::get_max_end_time()))
1257 return NULL;
1258 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1259 ret->position = ec::Vec3(x, z, -y);
1260 ec::Vec3 angle_vec(angle_x, angle_z, -angle_y);
1261 ret->position -= angle_vec;
1262 angle_vec.normalize(0.4);
1263 ret->effect = new ec::ImpactEffect(&eye_candy, &ret->dead, &ret->position, angle_vec, ec::ImpactEffect::SHIELD, LOD, strength);
1264 eye_candy.push_back_effect(ret->effect);
1265 return (ec_reference)ret;
1266 }
1267
ec_create_impact_magic_immunity(float x,float y,float z,float angle_x,float angle_y,float angle_z,int LOD,float strength)1268 extern "C" ec_reference ec_create_impact_magic_immunity(float x, float y, float z, float angle_x, float angle_y, float angle_z, int LOD, float strength)
1269 {
1270 if (!ec_in_range(x, y, z, ec::ImpactEffect::get_max_end_time()))
1271 return NULL;
1272 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1273 ret->position = ec::Vec3(x, z, -y);
1274 ec::Vec3 angle_vec(angle_x, angle_z, -angle_y);
1275 ret->position -= angle_vec;
1276 angle_vec.normalize(0.5);
1277 ret->effect = new ec::ImpactEffect(&eye_candy, &ret->dead, &ret->position, angle_vec, ec::ImpactEffect::MAGIC_IMMUNITY, LOD, strength);
1278 eye_candy.push_back_effect(ret->effect);
1279 return (ec_reference)ret;
1280 }
1281
ec_create_impact_poison(float x,float y,float z,float angle_x,float angle_y,float angle_z,int LOD,float strength)1282 extern "C" ec_reference ec_create_impact_poison(float x, float y, float z, float angle_x, float angle_y, float angle_z, int LOD, float strength)
1283 {
1284 if (!ec_in_range(x, y, z, ec::ImpactEffect::get_max_end_time()))
1285 return NULL;
1286 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1287 ret->position = ec::Vec3(x, z, -y);
1288 ec::Vec3 angle_vec(angle_x, angle_z, -angle_y);
1289 ret->position -= angle_vec;
1290 angle_vec.normalize(0.1);
1291 ret->effect = new ec::ImpactEffect(&eye_candy, &ret->dead, &ret->position, angle_vec, ec::ImpactEffect::POISON, LOD, strength);
1292 eye_candy.push_back_effect(ret->effect);
1293 return (ec_reference)ret;
1294 }
1295
ec_create_impact_blood(float x,float y,float z,float angle_x,float angle_y,float angle_z,int LOD,float strength)1296 extern "C" ec_reference ec_create_impact_blood(float x, float y, float z, float angle_x, float angle_y, float angle_z, int LOD, float strength)
1297 {
1298 if (!ec_in_range(x, y, z, ec::ImpactEffect::get_max_end_time()))
1299 return NULL;
1300 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1301 ret->position = ec::Vec3(x, z, -y);
1302 ec::Vec3 angle_vec(angle_x, angle_z, -angle_y);
1303 ret->position -= angle_vec;
1304 angle_vec.normalize(0.05);
1305 ret->effect = new ec::ImpactEffect(&eye_candy, &ret->dead, &ret->position, angle_vec, ec::ImpactEffect::BLOOD, LOD, strength);
1306 eye_candy.push_back_effect(ret->effect);
1307 return (ec_reference)ret;
1308 }
1309
ec_create_lamp(float x,float y,float z,float hue_adjust,float saturation_adjust,float scale,int LOD)1310 extern "C" ec_reference ec_create_lamp(float x, float y, float z, float hue_adjust, float saturation_adjust, float scale, int LOD)
1311 {
1312 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1313 ret->position = ec::Vec3(x, z, -y);
1314 ret->effect = new ec::LampEffect(&eye_candy, &ret->dead, &ret->position, hue_adjust, saturation_adjust, scale, use_lamp_halo, LOD);
1315 eye_candy.push_back_effect(ret->effect);
1316 return (ec_reference)ret;
1317 }
1318
ec_create_candle(float x,float y,float z,float hue_adjust,float saturation_adjust,float scale,int LOD)1319 extern "C" ec_reference ec_create_candle(float x, float y, float z, float hue_adjust, float saturation_adjust, float scale, int LOD)
1320 {
1321 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1322 ret->position = ec::Vec3(x, z, -y);
1323 ret->effect = new ec::CandleEffect(&eye_candy, &ret->dead, &ret->position, hue_adjust, saturation_adjust, scale, LOD);
1324 eye_candy.push_back_effect(ret->effect);
1325 return (ec_reference)ret;
1326 }
1327
ec_create_ongoing_magic_protection(float x,float y,float z,float hue_adjust,float saturation_adjust,int LOD,float scale)1328 extern "C" ec_reference ec_create_ongoing_magic_protection(float x, float y, float z, float hue_adjust, float saturation_adjust, int LOD, float scale)
1329 {
1330 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1331 ret->position = ec::Vec3(x, z, -y);
1332 ret->effect = new ec::OngoingEffect(&eye_candy, &ret->dead, &ret->position, hue_adjust, saturation_adjust, ec::OngoingEffect::OG_MAGIC_PROTECTION, LOD, scale, BUFF_MAGIC_PROTECTION);
1333 eye_candy.push_back_effect(ret->effect);
1334 return (ec_reference)ret;
1335 }
1336
ec_create_ongoing_shield(float x,float y,float z,float hue_adjust,float saturation_adjust,int LOD,float scale)1337 extern "C" ec_reference ec_create_ongoing_shield(float x, float y, float z, float hue_adjust, float saturation_adjust, int LOD, float scale)
1338 {
1339 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1340 ret->position = ec::Vec3(x, z, -y);
1341 ret->effect = new ec::OngoingEffect(&eye_candy, &ret->dead, &ret->position, hue_adjust, saturation_adjust, ec::OngoingEffect::OG_SHIELD, LOD, scale, BUFF_SHIELD);
1342 eye_candy.push_back_effect(ret->effect);
1343 return (ec_reference)ret;
1344 }
1345
ec_create_ongoing_magic_immunity(float x,float y,float z,float hue_adjust,float saturation_adjust,int LOD,float scale)1346 extern "C" ec_reference ec_create_ongoing_magic_immunity(float x, float y, float z, float hue_adjust, float saturation_adjust, int LOD, float scale)
1347 {
1348 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1349 ret->position = ec::Vec3(x, z, -y);
1350 ret->effect = new ec::OngoingEffect(&eye_candy, &ret->dead, &ret->position, hue_adjust, saturation_adjust, ec::OngoingEffect::OG_MAGIC_IMMUNITY, LOD, scale, BUFF_MAGIC_IMMUNITY);
1351 eye_candy.push_back_effect(ret->effect);
1352 return (ec_reference)ret;
1353 }
1354
ec_create_ongoing_poison(float x,float y,float z,float hue_adjust,float saturation_adjust,int LOD,float scale)1355 extern "C" ec_reference ec_create_ongoing_poison(float x, float y, float z, float hue_adjust, float saturation_adjust, int LOD, float scale)
1356 {
1357 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1358 ret->position = ec::Vec3(x, z, -y);
1359 ret->effect = new ec::OngoingEffect(&eye_candy, &ret->dead, &ret->position, hue_adjust, saturation_adjust, ec::OngoingEffect::OG_POISON, LOD, scale, 0); // BUFF_POISON isn't defined yet!
1360 eye_candy.push_back_effect(ret->effect);
1361 return (ec_reference)ret;
1362 }
1363
ec_create_selfmagic_teleport_to_the_portals_room(float x,float y,float z,int LOD)1364 extern "C" ec_reference ec_create_selfmagic_teleport_to_the_portals_room(float x, float y, float z, int LOD)
1365 {
1366 if (!ec_in_range(x, y, z, ec::SelfMagicEffect::get_max_end_time()))
1367 return NULL;
1368 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1369 ret->position = ec::Vec3(x, z, -y);
1370 ret->effect = new ec::SelfMagicEffect(&eye_candy, &ret->dead, &ret->position, ec::SelfMagicEffect::TELEPORT_TO_THE_PORTALS_ROOM, LOD);
1371 eye_candy.push_back_effect(ret->effect);
1372 return (ec_reference)ret;
1373 }
1374
ec_create_selfmagic_magic_immunity(float x,float y,float z,int LOD)1375 extern "C" ec_reference ec_create_selfmagic_magic_immunity(float x, float y, float z, int LOD)
1376 {
1377 if (!ec_in_range(x, y, z, ec::SelfMagicEffect::get_max_end_time()))
1378 return NULL;
1379 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1380 ret->position = ec::Vec3(x + X_OFFSET, z, -(y + Y_OFFSET));
1381 ret->effect = new ec::SelfMagicEffect(&eye_candy, &ret->dead, &ret->position, ec::SelfMagicEffect::MAGIC_IMMUNITY, LOD);
1382 eye_candy.push_back_effect(ret->effect);
1383 return (ec_reference)ret;
1384 }
1385
ec_create_smoke(float x,float y,float z,float hue_adjust,float saturation_adjust,float scale,int LOD)1386 extern "C" ec_reference ec_create_smoke(float x, float y, float z, float hue_adjust, float saturation_adjust, float scale, int LOD)
1387 {
1388 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1389 ret->position = ec::Vec3(x, z, -y);
1390 ret->effect = new ec::SmokeEffect(&eye_candy, &ret->dead, &ret->position, hue_adjust, saturation_adjust, scale, LOD);
1391 eye_candy.push_back_effect(ret->effect);
1392 return (ec_reference)ret;
1393 }
1394
ec_create_summon_rabbit(float x,float y,float z,int LOD)1395 extern "C" ec_reference ec_create_summon_rabbit(float x, float y, float z, int LOD)
1396 {
1397 if (!ec_in_range(x, y, z, ec::SelfMagicEffect::get_max_end_time()))
1398 return NULL;
1399 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1400 ret->position = ec::Vec3(x, z, -y);
1401 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::RABBIT, LOD);
1402 eye_candy.push_back_effect(ret->effect);
1403 return (ec_reference)ret;
1404 }
1405
ec_create_summon_rat(float x,float y,float z,int LOD)1406 extern "C" ec_reference ec_create_summon_rat(float x, float y, float z, int LOD)
1407 {
1408 if (!ec_in_range(x, y, z, ec::SummonEffect::get_max_end_time()))
1409 return NULL;
1410 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1411 ret->position = ec::Vec3(x, z, -y);
1412 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::RAT, LOD);
1413 eye_candy.push_back_effect(ret->effect);
1414 return (ec_reference)ret;
1415 }
1416
ec_create_summon_beaver(float x,float y,float z,int LOD)1417 extern "C" ec_reference ec_create_summon_beaver(float x, float y, float z, int LOD)
1418 {
1419 if (!ec_in_range(x, y, z, ec::SummonEffect::get_max_end_time()))
1420 return NULL;
1421 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1422 ret->position = ec::Vec3(x, z, -y);
1423 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::BEAVER, LOD);
1424 eye_candy.push_back_effect(ret->effect);
1425 return (ec_reference)ret;
1426 }
1427
ec_create_summon_skunk(float x,float y,float z,int LOD)1428 extern "C" ec_reference ec_create_summon_skunk(float x, float y, float z, int LOD)
1429 {
1430 if (!ec_in_range(x, y, z, ec::SummonEffect::get_max_end_time()))
1431 return NULL;
1432 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1433 ret->position = ec::Vec3(x, z, -y);
1434 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::SKUNK, LOD);
1435 eye_candy.push_back_effect(ret->effect);
1436 return (ec_reference)ret;
1437 }
1438
ec_create_summon_racoon(float x,float y,float z,int LOD)1439 extern "C" ec_reference ec_create_summon_racoon(float x, float y, float z, int LOD)
1440 {
1441 if (!ec_in_range(x, y, z, ec::SummonEffect::get_max_end_time()))
1442 return NULL;
1443 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1444 ret->position = ec::Vec3(x, z, -y);
1445 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::RACOON, LOD);
1446 eye_candy.push_back_effect(ret->effect);
1447 return (ec_reference)ret;
1448 }
1449
ec_create_summon_deer(float x,float y,float z,int LOD)1450 extern "C" ec_reference ec_create_summon_deer(float x, float y, float z, int LOD)
1451 {
1452 if (!ec_in_range(x, y, z, ec::SummonEffect::get_max_end_time()))
1453 return NULL;
1454 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1455 ret->position = ec::Vec3(x, z, -y);
1456 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::DEER, LOD);
1457 eye_candy.push_back_effect(ret->effect);
1458 return (ec_reference)ret;
1459 }
1460
ec_create_summon_green_snake(float x,float y,float z,int LOD)1461 extern "C" ec_reference ec_create_summon_green_snake(float x, float y, float z, int LOD)
1462 {
1463 if (!ec_in_range(x, y, z, ec::SummonEffect::get_max_end_time()))
1464 return NULL;
1465 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1466 ret->position = ec::Vec3(x, z, -y);
1467 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::GREEN_SNAKE, LOD);
1468 eye_candy.push_back_effect(ret->effect);
1469 return (ec_reference)ret;
1470 }
1471
ec_create_summon_red_snake(float x,float y,float z,int LOD)1472 extern "C" ec_reference ec_create_summon_red_snake(float x, float y, float z, int LOD)
1473 {
1474 if (!ec_in_range(x, y, z, ec::SummonEffect::get_max_end_time()))
1475 return NULL;
1476 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1477 ret->position = ec::Vec3(x, z, -y);
1478 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::RED_SNAKE, LOD);
1479 eye_candy.push_back_effect(ret->effect);
1480 return (ec_reference)ret;
1481 }
1482
ec_create_summon_brown_snake(float x,float y,float z,int LOD)1483 extern "C" ec_reference ec_create_summon_brown_snake(float x, float y, float z, int LOD)
1484 {
1485 if (!ec_in_range(x, y, z, ec::SummonEffect::get_max_end_time()))
1486 return NULL;
1487 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1488 ret->position = ec::Vec3(x, z, -y);
1489 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::BROWN_SNAKE, LOD);
1490 eye_candy.push_back_effect(ret->effect);
1491 return (ec_reference)ret;
1492 }
1493
ec_create_summon_fox(float x,float y,float z,int LOD)1494 extern "C" ec_reference ec_create_summon_fox(float x, float y, float z, int LOD)
1495 {
1496 if (!ec_in_range(x, y, z, ec::SummonEffect::get_max_end_time()))
1497 return NULL;
1498 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1499 ret->position = ec::Vec3(x, z, -y);
1500 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::FOX, LOD);
1501 eye_candy.push_back_effect(ret->effect);
1502 return (ec_reference)ret;
1503 }
1504
ec_create_summon_boar(float x,float y,float z,int LOD)1505 extern "C" ec_reference ec_create_summon_boar(float x, float y, float z, int LOD)
1506 {
1507 if (!ec_in_range(x, y, z, ec::SummonEffect::get_max_end_time()))
1508 return NULL;
1509 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1510 ret->position = ec::Vec3(x, z, -y);
1511 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::BOAR, LOD);
1512 eye_candy.push_back_effect(ret->effect);
1513 return (ec_reference)ret;
1514 }
1515
ec_create_summon_wolf(float x,float y,float z,int LOD)1516 extern "C" ec_reference ec_create_summon_wolf(float x, float y, float z, int LOD)
1517 {
1518 if (!ec_in_range(x, y, z, ec::SummonEffect::get_max_end_time()))
1519 return NULL;
1520 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1521 ret->position = ec::Vec3(x, z, -y);
1522 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::WOLF, LOD);
1523 eye_candy.push_back_effect(ret->effect);
1524 return (ec_reference)ret;
1525 }
1526
ec_create_summon_skeleton(float x,float y,float z,int LOD)1527 extern "C" ec_reference ec_create_summon_skeleton(float x, float y, float z, int LOD)
1528 {
1529 if (!ec_in_range(x, y, z, ec::SummonEffect::get_max_end_time()))
1530 return NULL;
1531 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1532 ret->position = ec::Vec3(x, z, -y);
1533 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::SKELETON, LOD);
1534 eye_candy.push_back_effect(ret->effect);
1535 return (ec_reference)ret;
1536 }
1537
ec_create_summon_small_gargoyle(float x,float y,float z,int LOD)1538 extern "C" ec_reference ec_create_summon_small_gargoyle(float x, float y, float z, int LOD)
1539 {
1540 if (!ec_in_range(x, y, z, ec::SummonEffect::get_max_end_time()))
1541 return NULL;
1542 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1543 ret->position = ec::Vec3(x, z, -y);
1544 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::SMALL_GARGOYLE, LOD);
1545 eye_candy.push_back_effect(ret->effect);
1546 return (ec_reference)ret;
1547 }
1548
ec_create_summon_medium_gargoyle(float x,float y,float z,int LOD)1549 extern "C" ec_reference ec_create_summon_medium_gargoyle(float x, float y, float z, int LOD)
1550 {
1551 if (!ec_in_range(x, y, z, ec::SummonEffect::get_max_end_time()))
1552 return NULL;
1553 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1554 ret->position = ec::Vec3(x, z, -y);
1555 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::MEDIUM_GARGOYLE, LOD);
1556 eye_candy.push_back_effect(ret->effect);
1557 return (ec_reference)ret;
1558 }
1559
ec_create_summon_large_gargoyle(float x,float y,float z,int LOD)1560 extern "C" ec_reference ec_create_summon_large_gargoyle(float x, float y, float z, int LOD)
1561 {
1562 if (!ec_in_range(x, y, z, ec::SummonEffect::get_max_end_time()))
1563 return NULL;
1564 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1565 ret->position = ec::Vec3(x, z, -y);
1566 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::LARGE_GARGOYLE, LOD);
1567 eye_candy.push_back_effect(ret->effect);
1568 return (ec_reference)ret;
1569 }
1570
ec_create_summon_puma(float x,float y,float z,int LOD)1571 extern "C" ec_reference ec_create_summon_puma(float x, float y, float z, int LOD)
1572 {
1573 if (!ec_in_range(x, y, z, ec::SummonEffect::get_max_end_time()))
1574 return NULL;
1575 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1576 ret->position = ec::Vec3(x, z, -y);
1577 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::PUMA, LOD);
1578 eye_candy.push_back_effect(ret->effect);
1579 return (ec_reference)ret;
1580 }
1581
ec_create_summon_female_goblin(float x,float y,float z,int LOD)1582 extern "C" ec_reference ec_create_summon_female_goblin(float x, float y, float z, int LOD)
1583 {
1584 if (!ec_in_range(x, y, z, ec::SummonEffect::get_max_end_time()))
1585 return NULL;
1586 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1587 ret->position = ec::Vec3(x, z, -y);
1588 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::FEMALE_GOBLIN, LOD);
1589 eye_candy.push_back_effect(ret->effect);
1590 return (ec_reference)ret;
1591 }
1592
ec_create_summon_polar_bear(float x,float y,float z,int LOD)1593 extern "C" ec_reference ec_create_summon_polar_bear(float x, float y, float z, int LOD)
1594 {
1595 if (!ec_in_range(x, y, z, ec::SummonEffect::get_max_end_time()))
1596 return NULL;
1597 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1598 ret->position = ec::Vec3(x, z, -y);
1599 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::POLAR_BEAR, LOD);
1600 eye_candy.push_back_effect(ret->effect);
1601 return (ec_reference)ret;
1602 }
1603
ec_create_summon_bear(float x,float y,float z,int LOD)1604 extern "C" ec_reference ec_create_summon_bear(float x, float y, float z, int LOD)
1605 {
1606 if (!ec_in_range(x, y, z, ec::SummonEffect::get_max_end_time()))
1607 return NULL;
1608 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1609 ret->position = ec::Vec3(x, z, -y);
1610 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::BEAR, LOD);
1611 eye_candy.push_back_effect(ret->effect);
1612 return (ec_reference)ret;
1613 }
1614
ec_create_summon_armed_male_goblin(float x,float y,float z,int LOD)1615 extern "C" ec_reference ec_create_summon_armed_male_goblin(float x, float y, float z, int LOD)
1616 {
1617 if (!ec_in_range(x, y, z, ec::SummonEffect::get_max_end_time()))
1618 return NULL;
1619 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1620 ret->position = ec::Vec3(x, z, -y);
1621 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::ARMED_MALE_GOBLIN, LOD);
1622 eye_candy.push_back_effect(ret->effect);
1623 return (ec_reference)ret;
1624 }
1625
ec_create_summon_armed_skeleton(float x,float y,float z,int LOD)1626 extern "C" ec_reference ec_create_summon_armed_skeleton(float x, float y, float z, int LOD)
1627 {
1628 if (!ec_in_range(x, y, z, ec::SummonEffect::get_max_end_time()))
1629 return NULL;
1630 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1631 ret->position = ec::Vec3(x, z, -y);
1632 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::ARMED_SKELETON, LOD);
1633 eye_candy.push_back_effect(ret->effect);
1634 return (ec_reference)ret;
1635 }
1636
ec_create_summon_female_orc(float x,float y,float z,int LOD)1637 extern "C" ec_reference ec_create_summon_female_orc(float x, float y, float z, int LOD)
1638 {
1639 if (!ec_in_range(x, y, z, ec::SummonEffect::get_max_end_time()))
1640 return NULL;
1641 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1642 ret->position = ec::Vec3(x, z, -y);
1643 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::FEMALE_ORC, LOD);
1644 eye_candy.push_back_effect(ret->effect);
1645 return (ec_reference)ret;
1646 }
1647
ec_create_summon_male_orc(float x,float y,float z,int LOD)1648 extern "C" ec_reference ec_create_summon_male_orc(float x, float y, float z, int LOD)
1649 {
1650 if (!ec_in_range(x, y, z, ec::SummonEffect::get_max_end_time()))
1651 return NULL;
1652 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1653 ret->position = ec::Vec3(x, z, -y);
1654 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::MALE_ORC, LOD);
1655 eye_candy.push_back_effect(ret->effect);
1656 return (ec_reference)ret;
1657 }
1658
ec_create_summon_armed_female_orc(float x,float y,float z,int LOD)1659 extern "C" ec_reference ec_create_summon_armed_female_orc(float x, float y, float z, int LOD)
1660 {
1661 if (!ec_in_range(x, y, z, ec::SummonEffect::get_max_end_time()))
1662 return NULL;
1663 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1664 ret->position = ec::Vec3(x, z, -y);
1665 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::ARMED_FEMALE_ORC, LOD);
1666 eye_candy.push_back_effect(ret->effect);
1667 return (ec_reference)ret;
1668 }
1669
ec_create_summon_armed_male_orc(float x,float y,float z,int LOD)1670 extern "C" ec_reference ec_create_summon_armed_male_orc(float x, float y, float z, int LOD)
1671 {
1672 if (!ec_in_range(x, y, z, ec::SummonEffect::get_max_end_time()))
1673 return NULL;
1674 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1675 ret->position = ec::Vec3(x, z, -y);
1676 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::ARMED_MALE_ORC, LOD);
1677 eye_candy.push_back_effect(ret->effect);
1678 return (ec_reference)ret;
1679 }
1680
ec_create_summon_cyclops(float x,float y,float z,int LOD)1681 extern "C" ec_reference ec_create_summon_cyclops(float x, float y, float z, int LOD)
1682 {
1683 if (!ec_in_range(x, y, z, ec::SummonEffect::get_max_end_time()))
1684 return NULL;
1685 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1686 ret->position = ec::Vec3(x, z, -y);
1687 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::CYCLOPS, LOD);
1688 eye_candy.push_back_effect(ret->effect);
1689 return (ec_reference)ret;
1690 }
1691
ec_create_summon_fluffy(float x,float y,float z,int LOD)1692 extern "C" ec_reference ec_create_summon_fluffy(float x, float y, float z, int LOD)
1693 {
1694 if (!ec_in_range(x, y, z, ec::SummonEffect::get_max_end_time()))
1695 return NULL;
1696 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1697 ret->position = ec::Vec3(x, z, -y);
1698 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::FLUFFY, LOD);
1699 eye_candy.push_back_effect(ret->effect);
1700 return (ec_reference)ret;
1701 }
1702
ec_create_summon_phantom_warrior(float x,float y,float z,int LOD)1703 extern "C" ec_reference ec_create_summon_phantom_warrior(float x, float y, float z, int LOD)
1704 {
1705 if (!ec_in_range(x, y, z, ec::SummonEffect::get_max_end_time()))
1706 return NULL;
1707 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1708 ret->position = ec::Vec3(x, z, -y);
1709 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::PHANTOM_WARRIOR, LOD);
1710 eye_candy.push_back_effect(ret->effect);
1711 return (ec_reference)ret;
1712 }
1713
ec_create_summon_mountain_chimeran(float x,float y,float z,int LOD)1714 extern "C" ec_reference ec_create_summon_mountain_chimeran(float x, float y, float z, int LOD)
1715 {
1716 if (!ec_in_range(x, y, z, ec::SummonEffect::get_max_end_time()))
1717 return NULL;
1718 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1719 ret->position = ec::Vec3(x, z, -y);
1720 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::MOUNTAIN_CHIMERAN, LOD);
1721 eye_candy.push_back_effect(ret->effect);
1722 return (ec_reference)ret;
1723 }
1724
ec_create_summon_yeti(float x,float y,float z,int LOD)1725 extern "C" ec_reference ec_create_summon_yeti(float x, float y, float z, int LOD)
1726 {
1727 if (!ec_in_range(x, y, z, ec::SummonEffect::get_max_end_time()))
1728 return NULL;
1729 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1730 ret->position = ec::Vec3(x, z, -y);
1731 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::YETI, LOD);
1732 eye_candy.push_back_effect(ret->effect);
1733 return (ec_reference)ret;
1734 }
1735
ec_create_summon_arctic_chimeran(float x,float y,float z,int LOD)1736 extern "C" ec_reference ec_create_summon_arctic_chimeran(float x, float y, float z, int LOD)
1737 {
1738 if (!ec_in_range(x, y, z, ec::SummonEffect::get_max_end_time()))
1739 return NULL;
1740 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1741 ret->position = ec::Vec3(x, z, -y);
1742 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::ARCTIC_CHIMERAN, LOD);
1743 eye_candy.push_back_effect(ret->effect);
1744 return (ec_reference)ret;
1745 }
1746
ec_create_summon_giant(float x,float y,float z,int LOD)1747 extern "C" ec_reference ec_create_summon_giant(float x, float y, float z, int LOD)
1748 {
1749 if (!ec_in_range(x, y, z, ec::SummonEffect::get_max_end_time()))
1750 return NULL;
1751 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1752 ret->position = ec::Vec3(x, z, -y);
1753 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::GIANT, LOD);
1754 eye_candy.push_back_effect(ret->effect);
1755 return (ec_reference)ret;
1756 }
1757
ec_create_summon_giant_snake(float x,float y,float z,int LOD)1758 extern "C" ec_reference ec_create_summon_giant_snake(float x, float y, float z, int LOD)
1759 {
1760 if (!ec_in_range(x, y, z, ec::SummonEffect::get_max_end_time()))
1761 return NULL;
1762 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1763 ret->position = ec::Vec3(x, z, -y);
1764 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::GIANT_SNAKE, LOD);
1765 eye_candy.push_back_effect(ret->effect);
1766 return (ec_reference)ret;
1767 }
1768
ec_create_summon_spider(float x,float y,float z,int LOD)1769 extern "C" ec_reference ec_create_summon_spider(float x, float y, float z, int LOD)
1770 {
1771 if (!ec_in_range(x, y, z, ec::SummonEffect::get_max_end_time()))
1772 return NULL;
1773 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1774 ret->position = ec::Vec3(x, z, -y);
1775 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::SPIDER, LOD);
1776 eye_candy.push_back_effect(ret->effect);
1777 return (ec_reference)ret;
1778 }
1779
ec_create_summon_tiger(float x,float y,float z,int LOD)1780 extern "C" ec_reference ec_create_summon_tiger(float x, float y, float z, int LOD)
1781 {
1782 if (!ec_in_range(x, y, z, ec::SummonEffect::get_max_end_time()))
1783 return NULL;
1784 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1785 ret->position = ec::Vec3(x, z, -y);
1786 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::TIGER, LOD);
1787 eye_candy.push_back_effect(ret->effect);
1788 return (ec_reference)ret;
1789 }
1790
ec_create_targetmagic_teleport_to_range(float start_x,float start_y,float start_z,float end_x,float end_y,float end_z,int LOD)1791 extern "C" ec_reference ec_create_targetmagic_teleport_to_range(float start_x, float start_y, float start_z, float end_x, float end_y, float end_z, int LOD)
1792 {
1793 if (!ec_in_range(start_x, start_y, start_z, ec::TargetMagicEffect::get_max_end_time()))
1794 return NULL;
1795 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1796 ret->position = ec::Vec3(start_x, start_z, -start_y);
1797 ret->position2 = ec::Vec3(end_x, end_z, -end_y);
1798 ret->effect = new ec::TargetMagicEffect(&eye_candy, &ret->dead, &ret->position, &ret->position2, ec::TargetMagicEffect::TELEPORT_TO_RANGE, &general_obstructions_list, LOD);
1799 eye_candy.push_back_effect(ret->effect);
1800 return (ec_reference)ret;
1801 }
1802
ec_create_targetmagic_life_drain(float start_x,float start_y,float start_z,float end_x,float end_y,float end_z,int LOD)1803 extern "C" ec_reference ec_create_targetmagic_life_drain(float start_x, float start_y, float start_z, float end_x, float end_y, float end_z, int LOD)
1804 {
1805 if (!ec_in_range(start_x, start_y, start_z, ec::TargetMagicEffect::get_max_end_time()))
1806 return NULL;
1807 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1808 ret->position = ec::Vec3(start_x, start_z, -start_y);
1809 ret->position2 = ec::Vec3(end_x, end_z, -end_y);
1810 ret->effect = new ec::TargetMagicEffect(&eye_candy, &ret->dead, &ret->position, &ret->position2, ec::TargetMagicEffect::LIFE_DRAIN, &general_obstructions_list, LOD);
1811 eye_candy.push_back_effect(ret->effect);
1812 return (ec_reference)ret;
1813 }
1814
ec_launch_targetmagic_heal_summoned(ec_reference reference,float start_x,float start_y,float start_z,int LOD)1815 extern "C" void ec_launch_targetmagic_heal_summoned(ec_reference reference, float start_x, float start_y, float start_z, int LOD)
1816 {
1817 ec_internal_reference* cast_reference = (ec_internal_reference*)reference;
1818 if (!ec_in_range(start_x, start_y, start_z, ec::TargetMagicEffect::get_max_end_time()))
1819 {
1820 delete cast_reference;
1821 return;
1822 }
1823 cast_reference->position = ec::Vec3(start_x, start_z, -start_y);
1824 std::vector<ec::Vec3*> target_ptrs;
1825 for (auto& target: cast_reference->targets)
1826 target_ptrs.push_back(&target);
1827 cast_reference->effect = new ec::TargetMagicEffect(&eye_candy, &cast_reference->dead, &cast_reference->position, target_ptrs, ec::TargetMagicEffect::HEAL_SUMMONED, &general_obstructions_list, LOD);
1828 eye_candy.push_back_effect(cast_reference->effect);
1829 }
1830
ec_launch_targetmagic_smite_summoned(ec_reference reference,float start_x,float start_y,float start_z,int LOD)1831 extern "C" void ec_launch_targetmagic_smite_summoned(ec_reference reference, float start_x, float start_y, float start_z, int LOD)
1832 {
1833 ec_internal_reference* cast_reference = (ec_internal_reference*)reference;
1834 if (!ec_in_range(start_x, start_y, start_z, ec::TargetMagicEffect::get_max_end_time()))
1835 {
1836 delete cast_reference;
1837 return;
1838 }
1839 cast_reference->position = ec::Vec3(start_x, start_z, -start_y);
1840 std::vector<ec::Vec3*> target_ptrs;
1841 for (auto& target: cast_reference->targets)
1842 target_ptrs.push_back(&target);
1843 cast_reference->effect = new ec::TargetMagicEffect(&eye_candy, &cast_reference->dead, &cast_reference->position, target_ptrs, ec::TargetMagicEffect::SMITE_SUMMONED, &general_obstructions_list, LOD);
1844 eye_candy.push_back_effect(cast_reference->effect);
1845 }
1846
ec_create_teleporter(float x,float y,float z,float hue_adjust,float saturation_adjust,float scale,int LOD)1847 extern "C" ec_reference ec_create_teleporter(float x, float y, float z, float hue_adjust, float saturation_adjust, float scale, int LOD)
1848 {
1849 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1850 ret->position = ec::Vec3(x, z, -y);
1851 ret->effect = new ec::TeleporterEffect(&eye_candy, &ret->dead, &ret->position, hue_adjust, saturation_adjust, scale, LOD);
1852 eye_candy.push_back_effect(ret->effect);
1853 return (ec_reference)ret;
1854 }
1855
ec_create_wind_leaves(float x,float y,float z,float hue_adjust,float saturation_adjust,float scale,float density,ec_bounds bounds,float prevailing_wind_x,float prevailing_wind_y,float prevailing_wind_z)1856 extern "C" ec_reference ec_create_wind_leaves(float x, float y, float z, float hue_adjust, float saturation_adjust, float scale, float density, ec_bounds bounds, float prevailing_wind_x, float prevailing_wind_y, float prevailing_wind_z)
1857 {
1858 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1859 ret->bounds = *(ec::SmoothPolygonBoundingRange*)bounds;
1860 ret->position = ec::Vec3(x, z, -y);
1861 ret->position2 = ec::Vec3(prevailing_wind_x, prevailing_wind_z, -(prevailing_wind_y + 0.25));
1862 ret->effect = new ec::WindEffect(&eye_candy, &ret->dead, &ret->position, &general_obstructions_list, hue_adjust, saturation_adjust, scale, density, &ret->bounds, ec::WindEffect::LEAVES, ret->position2);
1863 eye_candy.push_back_effect(ret->effect);
1864 return (ec_reference)ret;
1865 }
1866
ec_create_wind_petals(float x,float y,float z,float hue_adjust,float saturation_adjust,float scale,float density,ec_bounds bounds,float prevailing_wind_x,float prevailing_wind_y,float prevailing_wind_z)1867 extern "C" ec_reference ec_create_wind_petals(float x, float y, float z, float hue_adjust, float saturation_adjust, float scale, float density, ec_bounds bounds, float prevailing_wind_x, float prevailing_wind_y, float prevailing_wind_z)
1868 {
1869 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
1870 ret->bounds = *(ec::SmoothPolygonBoundingRange*)bounds;
1871 ret->position = ec::Vec3(x, z, -y);
1872 ret->position2 = ec::Vec3(prevailing_wind_x, prevailing_wind_z, -(prevailing_wind_y + 0.25));
1873 ret->effect = new ec::WindEffect(&eye_candy, &ret->dead, &ret->position, &general_obstructions_list, hue_adjust, saturation_adjust, scale, density, &ret->bounds, ec::WindEffect::FLOWER_PETALS, ret->position2);
1874 eye_candy.push_back_effect(ret->effect);
1875 return (ec_reference)ret;
1876 }
1877
1878 #ifndef MAP_EDITOR
ec_get_z(actor * _actor)1879 float ec_get_z(actor* _actor)
1880 {
1881 if (_actor != NULL)
1882 {
1883 return get_tile_height(_actor->x_tile_pos, _actor->y_tile_pos);
1884 }
1885 else
1886 {
1887 return 0.0f;
1888 }
1889 }
1890
ec_actor_delete(actor * _actor)1891 extern "C" void ec_actor_delete(actor* _actor)
1892 {
1893 force_idle = true;
1894 for (int i = 0; i < (int)references.size(); )
1895 {
1896 std::vector<ec_internal_reference*>::iterator iter = references.begin() + i;
1897 if ((*iter)->dead)
1898 {
1899 delete *iter;
1900 references.erase(iter);
1901 continue;
1902 }
1903
1904 i++;
1905 if (((*iter)->caster == _actor) || ((*iter)->target == _actor))
1906 {
1907 (*iter)->effect->recall = true;
1908 (*iter)->caster = NULL;
1909 (*iter)->target = NULL;
1910 continue;
1911 }
1912 for (int j = 0; j < (int)(*iter)->target_actors.size(); j++)
1913 {
1914 std::vector<actor*>::iterator iter2 = (*iter)->target_actors.begin() + j;
1915 if (*iter2 == _actor)
1916 (*iter2) = NULL;
1917 }
1918 }
1919 for (ec_actor_obstructions::iterator iter = actor_obstructions.begin(); iter != actor_obstructions.end(); ++iter)
1920 {
1921 if ((*iter)->obstructing_actor == _actor)
1922 {
1923 for (std::vector<ec::Obstruction*>::iterator iter2 = general_obstructions_list.begin(); iter2 != general_obstructions_list.end(); ++iter2)
1924 {
1925 if (*iter2 == (*iter)->obstruction)
1926 {
1927 general_obstructions_list.erase(iter2);
1928 break;
1929 }
1930 }
1931 delete (*iter)->obstruction;
1932 delete *iter;
1933 actor_obstructions.erase(iter);
1934 break;
1935 }
1936 }
1937 }
1938
ec_add_actor_obstruction(actor * _actor,float force)1939 extern "C" void ec_add_actor_obstruction(actor* _actor, float force)
1940 {
1941 ec_actor_obstruction* obstruction = new ec_actor_obstruction;
1942 obstruction->obstructing_actor = _actor;
1943 obstruction->center = ec::Vec3(_actor->x_pos + X_OFFSET, ec_get_z(_actor), -(_actor->y_pos + Y_OFFSET));
1944 obstruction->obstruction = new ec::CappedSimpleCylinderObstruction(&(obstruction->center), 0.55, force, obstruction->center.y, obstruction->center.y + 0.9);
1945 actor_obstructions.push_back(obstruction);
1946 }
1947
ec_remove_weapon(actor * _actor)1948 extern "C" void ec_remove_weapon(actor* _actor)
1949 {
1950 force_idle = true;
1951 for (int i = 0; i < (int)references.size(); )
1952 {
1953 std::vector<ec_internal_reference*>::iterator iter = references.begin() + i;
1954 if ((*iter)->dead)
1955 {
1956 delete *iter;
1957 references.erase(iter);
1958 continue;
1959 }
1960
1961 i++;
1962 if (((*iter)->caster == _actor) &&
1963 (((*iter)->effect->get_type() == ec::EC_SWORD)
1964 || (*iter)->effect->get_type() == ec::EC_STAFF))
1965 {
1966 (*iter)->effect->recall = true;
1967 (*iter)->caster = NULL;
1968 (*iter)->target = NULL;
1969 continue;
1970 }
1971 }
1972 }
1973
ec_remove_missile(int missile_id)1974 extern "C" void ec_remove_missile(int missile_id)
1975 {
1976 force_idle = true;
1977 for (int i = 0; i < (int)references.size(); )
1978 {
1979 std::vector<ec_internal_reference*>::iterator iter = references.begin() + i;
1980 if ((*iter)->dead)
1981 {
1982 delete *iter;
1983 references.erase(iter);
1984 continue;
1985 }
1986
1987 i++;
1988 if ((*iter)->effect->get_type() == ec::EC_MISSILE &&
1989 (*iter)->missile_id == missile_id)
1990 {
1991 // don't recall the effect, let the particles glow
1992 //(*iter)->effect->recall = true;
1993 // update position one last time
1994 missile *mis = get_missile_ptr_from_id(missile_id);
1995 if (mis)
1996 {
1997 (*iter)->position.x = mis->position[0] + mis->direction[0] * mis->remaining_distance;
1998 (*iter)->position.y = mis->position[2] + mis->direction[2] * mis->remaining_distance;
1999 (*iter)->position.z = -(mis->position[1] + mis->direction[1] * mis->remaining_distance);
2000 }
2001 // set missile_id to -1 so the position of the effect is not updated anymore
2002 (*iter)->missile_id = -1;
2003 continue;
2004 }
2005 }
2006 }
2007
ec_rename_missile(int old_id,int new_id)2008 void ec_rename_missile(int old_id, int new_id)
2009 {
2010 std::vector<ec_internal_reference*>::iterator it;
2011 for (it = references.begin(); it != references.end(); ++it)
2012 {
2013 if ((*it)->effect->get_type() == ec::EC_MISSILE && (*it)->missile_id == old_id)
2014 {
2015 (*it)->missile_id = new_id;
2016 }
2017 }
2018 }
2019
ec_create_breath_fire2(actor * caster,actor * target,int LOD,float scale)2020 extern "C" ec_reference ec_create_breath_fire2(actor* caster, actor* target, int LOD, float scale)
2021 {
2022 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::BreathEffect::get_max_end_time()))
2023 return NULL;
2024 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2025 ret->caster = caster;
2026 ret->target = target;
2027 ret->casterbone = get_actor_bone_id(caster, head_bone);
2028 ret->targetbone = get_actor_bone_id(target, body_bottom_bone);
2029 set_vec3_actor_bone2(ret->position, caster, ret->casterbone);
2030 set_vec3_target_bone2(ret->position2, target, ret->targetbone);
2031 ret->effect = new ec::BreathEffect(&eye_candy, &ret->dead, &ret->position, &ret->position2, &general_obstructions_list, ec::BreathEffect::FIRE, LOD, scale);
2032 eye_candy.push_back_effect(ret->effect);
2033 return (ec_reference)ret;
2034 }
2035
ec_create_breath_ice2(actor * caster,actor * target,int LOD,float scale)2036 extern "C" ec_reference ec_create_breath_ice2(actor* caster, actor* target, int LOD, float scale)
2037 {
2038 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::BreathEffect::get_max_end_time()))
2039 return NULL;
2040 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2041 ret->caster = caster;
2042 ret->target = target;
2043 ret->casterbone = get_actor_bone_id(caster, head_bone);
2044 ret->targetbone = get_actor_bone_id(target, body_bottom_bone);
2045 set_vec3_actor_bone2(ret->position, caster, ret->casterbone);
2046 set_vec3_target_bone2(ret->position2, target, ret->targetbone);
2047 ret->effect = new ec::BreathEffect(&eye_candy, &ret->dead, &ret->position, &ret->position2, &general_obstructions_list, ec::BreathEffect::ICE, LOD, scale);
2048 eye_candy.push_back_effect(ret->effect);
2049 return (ec_reference)ret;
2050 }
2051
ec_create_breath_poison2(actor * caster,actor * target,int LOD,float scale)2052 extern "C" ec_reference ec_create_breath_poison2(actor* caster, actor* target, int LOD, float scale)
2053 {
2054 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::BreathEffect::get_max_end_time()))
2055 return NULL;
2056 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2057 ret->caster = caster;
2058 ret->target = target;
2059 ret->casterbone = get_actor_bone_id(caster, head_bone);
2060 ret->targetbone = get_actor_bone_id(target, body_bottom_bone);
2061 set_vec3_actor_bone2(ret->position, caster, ret->casterbone);
2062 set_vec3_target_bone2(ret->position2, target, ret->targetbone);
2063 ret->effect = new ec::BreathEffect(&eye_candy, &ret->dead, &ret->position, &ret->position2, &general_obstructions_list, ec::BreathEffect::POISON, LOD, scale);
2064 eye_candy.push_back_effect(ret->effect);
2065 return (ec_reference)ret;
2066 }
2067
ec_create_breath_magic2(actor * caster,actor * target,int LOD,float scale)2068 extern "C" ec_reference ec_create_breath_magic2(actor* caster, actor* target, int LOD, float scale)
2069 {
2070 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::BreathEffect::get_max_end_time()))
2071 return NULL;
2072 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2073 ret->caster = caster;
2074 ret->target = target;
2075 ret->casterbone = get_actor_bone_id(caster, head_bone);
2076 ret->targetbone = get_actor_bone_id(target, body_bottom_bone);
2077 set_vec3_actor_bone2(ret->position, caster, ret->casterbone);
2078 set_vec3_target_bone2(ret->position2, target, ret->targetbone);
2079 ret->effect = new ec::BreathEffect(&eye_candy, &ret->dead, &ret->position, &ret->position2, &general_obstructions_list, ec::BreathEffect::MAGIC, LOD, scale);
2080 eye_candy.push_back_effect(ret->effect);
2081 return (ec_reference)ret;
2082 }
2083
ec_create_breath_lightning2(actor * caster,actor * target,int LOD,float scale)2084 extern "C" ec_reference ec_create_breath_lightning2(actor* caster, actor* target, int LOD, float scale)
2085 {
2086 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::BreathEffect::get_max_end_time()))
2087 return NULL;
2088 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2089 ret->caster = caster;
2090 ret->target = target;
2091 ret->casterbone = get_actor_bone_id(caster, hand_right_bone);
2092 ret->targetbone = get_actor_bone_id(target, head_bone);
2093 set_vec3_actor_bone2(ret->position, caster, ret->casterbone);
2094 set_vec3_target_bone2(ret->position2, target, ret->targetbone);
2095 ret->effect = new ec::BreathEffect(&eye_candy, &ret->dead, &ret->position, &ret->position2, &general_obstructions_list, ec::BreathEffect::LIGHTNING, LOD, scale);
2096 eye_candy.push_back_effect(ret->effect);
2097 return (ec_reference)ret;
2098 }
2099
ec_create_breath_wind2(actor * caster,actor * target,int LOD,float scale)2100 extern "C" ec_reference ec_create_breath_wind2(actor* caster, actor* target, int LOD, float scale)
2101 {
2102 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::BreathEffect::get_max_end_time()))
2103 return NULL;
2104 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2105 ret->caster = caster;
2106 ret->target = target;
2107 ret->casterbone = get_actor_bone_id(caster, head_bone);
2108 ret->targetbone = get_actor_bone_id(target, body_bottom_bone);
2109 set_vec3_actor_bone2(ret->position, caster, ret->casterbone);
2110 set_vec3_target_bone2(ret->position2, target, ret->targetbone);
2111 ret->effect = new ec::BreathEffect(&eye_candy, &ret->dead, &ret->position, &ret->position2, &general_obstructions_list, ec::BreathEffect::WIND, LOD, scale);
2112 eye_candy.push_back_effect(ret->effect);
2113 return (ec_reference)ret;
2114 }
2115
ec_create_harvesting_radon_pouch2(actor * caster,int LOD)2116 extern "C" ec_reference ec_create_harvesting_radon_pouch2(actor* caster, int LOD)
2117 {
2118 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::MineEffect::get_max_end_time()))
2119 return NULL;
2120 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2121 ret->position = ec::Vec3(caster->x_pos + X_OFFSET, ec_get_z(caster), -(caster->y_pos + Y_OFFSET));
2122 ret->effect = new ec::HarvestingEffect(&eye_candy, &ret->dead, &ret->position, ec::HarvestingEffect::RADON_POUCH, LOD);
2123 eye_candy.push_back_effect(ret->effect);
2124 return (ec_reference)ret;
2125 }
2126
ec_create_harvesting_cavern_wall2(actor * caster,int LOD)2127 extern "C" ec_reference ec_create_harvesting_cavern_wall2(actor* caster, int LOD)
2128 {
2129 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::MineEffect::get_max_end_time()))
2130 return NULL;
2131 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2132 ret->position = ec::Vec3(caster->x_pos + X_OFFSET, ec_get_z(caster), -(caster->y_pos + Y_OFFSET));
2133 ret->effect = new ec::HarvestingEffect(&eye_candy, &ret->dead, &ret->position, ec::HarvestingEffect::CAVERN_WALL, LOD);
2134 eye_candy.push_back_effect(ret->effect);
2135 return (ec_reference)ret;
2136 }
2137
ec_create_harvesting_mother_nature2(actor * caster,int LOD)2138 extern "C" ec_reference ec_create_harvesting_mother_nature2(actor* caster, int LOD)
2139 {
2140 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::MineEffect::get_max_end_time()))
2141 return NULL;
2142 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2143 ret->position = ec::Vec3(caster->x_pos + X_OFFSET, ec_get_z(caster), -(caster->y_pos + Y_OFFSET));
2144 ret->effect = new ec::HarvestingEffect(&eye_candy, &ret->dead, &ret->position, ec::HarvestingEffect::MOTHER_NATURE, LOD);
2145 eye_candy.push_back_effect(ret->effect);
2146 return (ec_reference)ret;
2147 }
2148
ec_create_harvesting_queen_of_nature2(actor * caster,int LOD)2149 extern "C" ec_reference ec_create_harvesting_queen_of_nature2(actor* caster, int LOD)
2150 {
2151 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::MineEffect::get_max_end_time()))
2152 return NULL;
2153 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2154 ret->position = ec::Vec3(caster->x_pos + X_OFFSET, ec_get_z(caster), -(caster->y_pos + Y_OFFSET));
2155 ret->effect = new ec::HarvestingEffect(&eye_candy, &ret->dead, &ret->position, ec::HarvestingEffect::QUEEN_OF_NATURE, LOD);
2156 eye_candy.push_back_effect(ret->effect);
2157 return (ec_reference)ret;
2158 }
2159
ec_create_harvesting_bees2(actor * caster,int LOD)2160 extern "C" ec_reference ec_create_harvesting_bees2(actor* caster, int LOD)
2161 {
2162 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::HarvestingEffect::get_max_end_time()))
2163 return NULL;
2164 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2165 ret->caster = caster;
2166 ret->casterbone = get_actor_bone_id(caster, head_bone);
2167 set_vec3_actor_bone2(ret->position, ret->caster, ret->casterbone);
2168 ret->effect = new ec::HarvestingEffect(&eye_candy, &ret->dead, &ret->position, ec::HarvestingEffect::BEES, LOD);
2169 eye_candy.push_back_effect(ret->effect);
2170 return (ec_reference)ret;
2171 }
2172
ec_create_harvesting_bag_of_gold(float x,float y,float z,int LOD)2173 extern "C" ec_reference ec_create_harvesting_bag_of_gold(float x, float y, float z, int LOD)
2174 {
2175 if (!ec_in_range(x, y, z, ec::HarvestingEffect::get_max_end_time()))
2176 return NULL;
2177 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2178 ret->position = ec::Vec3(x, z, -y);
2179 ret->effect = new ec::HarvestingEffect(&eye_candy, &ret->dead, &ret->position, ec::HarvestingEffect::BAG_OF_GOLD, LOD);
2180 eye_candy.push_back_effect(ret->effect);
2181 return (ec_reference)ret;
2182 }
2183
ec_create_harvesting_bag_of_gold2(actor * caster,int LOD)2184 extern "C" ec_reference ec_create_harvesting_bag_of_gold2(actor* caster, int LOD)
2185 {
2186 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::HarvestingEffect::get_max_end_time()))
2187 return NULL;
2188 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2189 ret->caster = caster;
2190 ret->casterbone = get_actor_bone_id(caster, hand_right_bone);
2191 set_vec3_actor_bone2(ret->position, ret->caster, ret->casterbone);
2192 ret->effect = new ec::HarvestingEffect(&eye_candy, &ret->dead, &ret->position, ec::HarvestingEffect::BAG_OF_GOLD, LOD);
2193 eye_candy.push_back_effect(ret->effect);
2194 return (ec_reference)ret;
2195 }
2196
ec_create_harvesting_rare_stone(float x,float y,float z,int LOD)2197 extern "C" ec_reference ec_create_harvesting_rare_stone(float x, float y, float z, int LOD)
2198 {
2199 if (!ec_in_range(x, y, z, ec::HarvestingEffect::get_max_end_time()))
2200 return NULL;
2201 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2202 ret->position = ec::Vec3(x, z, -y);
2203 ret->effect = new ec::HarvestingEffect(&eye_candy, &ret->dead, &ret->position, ec::HarvestingEffect::RARE_STONE, LOD);
2204 eye_candy.push_back_effect(ret->effect);
2205 return (ec_reference)ret;
2206 }
2207
ec_create_harvesting_rare_stone2(actor * caster,int LOD)2208 extern "C" ec_reference ec_create_harvesting_rare_stone2(actor* caster, int LOD)
2209 {
2210 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::HarvestingEffect::get_max_end_time()))
2211 return NULL;
2212 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2213 ret->caster = caster;
2214 ret->casterbone = get_actor_bone_id(caster, hand_right_bone);
2215 set_vec3_actor_bone2(ret->position, ret->caster, ret->casterbone);
2216 ret->effect = new ec::HarvestingEffect(&eye_candy, &ret->dead, &ret->position, ec::HarvestingEffect::RARE_STONE, LOD);
2217 eye_candy.push_back_effect(ret->effect);
2218 return (ec_reference)ret;
2219 }
2220
ec_create_harvesting_tool_break(actor * caster,int LOD)2221 extern "C" ec_reference ec_create_harvesting_tool_break(actor* caster, int LOD)
2222 {
2223 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::HarvestingEffect::get_max_end_time()))
2224 return NULL;
2225 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2226 ret->caster = caster;
2227 set_vec3_actor_bone2(ret->position, ret->caster, get_actor_bone_id(caster, hand_right_bone));
2228 set_vec3_actor_bone2(ret->position2, ret->caster, get_actor_bone_id(caster, hand_left_bone));
2229 ret->effect = new ec::HarvestingEffect(&eye_candy, &ret->dead, &ret->position, &ret->position2, ec::HarvestingEffect::TOOL_BREAK, LOD);
2230 eye_candy.push_back_effect(ret->effect);
2231 return (ec_reference)ret;
2232 }
2233
ec_create_glow_remote_heal(actor * caster,int LOD)2234 extern "C" ec_reference ec_create_glow_remote_heal(actor* caster, int LOD)
2235 {
2236 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::GlowEffect::get_max_end_time()))
2237 return NULL;
2238 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2239 ret->caster = caster;
2240 ret->casterbone = get_actor_bone_id(caster, hand_right_bone);
2241 set_vec3_actor_bone2(ret->position, ret->caster, ret->casterbone);
2242 ret->effect = new ec::GlowEffect(&eye_candy, &ret->dead, &ret->position, ec::GlowEffect::REMOTE_HEAL_GLOW, LOD);
2243 eye_candy.push_back_effect(ret->effect);
2244 return (ec_reference)ret;
2245 }
2246
ec_create_glow_harm(actor * caster,int LOD)2247 extern "C" ec_reference ec_create_glow_harm(actor* caster, int LOD)
2248 {
2249 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::GlowEffect::get_max_end_time()))
2250 return NULL;
2251 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2252 ret->caster = caster;
2253 ret->casterbone = get_actor_bone_id(caster, hand_right_bone);
2254 set_vec3_actor_bone2(ret->position, ret->caster, ret->casterbone);
2255 ret->effect = new ec::GlowEffect(&eye_candy, &ret->dead, &ret->position, ec::GlowEffect::HARM_GLOW, LOD);
2256 eye_candy.push_back_effect(ret->effect);
2257 return (ec_reference)ret;
2258 }
2259
ec_create_glow_poison(actor * caster,int LOD)2260 extern "C" ec_reference ec_create_glow_poison(actor* caster, int LOD)
2261 {
2262 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::GlowEffect::get_max_end_time()))
2263 return NULL;
2264 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2265 ret->caster = caster;
2266 ret->casterbone = get_actor_bone_id(caster, hand_right_bone);
2267 set_vec3_actor_bone2(ret->position, ret->caster, ret->casterbone);
2268 ret->effect = new ec::GlowEffect(&eye_candy, &ret->dead, &ret->position, ec::GlowEffect::POISON_GLOW, LOD);
2269 eye_candy.push_back_effect(ret->effect);
2270 return (ec_reference)ret;
2271 }
2272
ec_create_glow_level_up_oa(actor * caster,int LOD)2273 extern "C" ec_reference ec_create_glow_level_up_oa(actor* caster, int LOD)
2274 {
2275 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::GlowEffect::get_max_end_time()))
2276 return NULL;
2277 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2278 ret->caster = caster;
2279 ret->casterbone = get_actor_bone_id(caster, body_bottom_bone);
2280 set_vec3_actor_bone2(ret->position, ret->caster, ret->casterbone);
2281 ret->effect = new ec::GlowEffect(&eye_candy, &ret->dead, &ret->position, ec::GlowEffect::LEVEL_UP_OA_GLOW, LOD);
2282 eye_candy.push_back_effect(ret->effect);
2283 return (ec_reference)ret;
2284 }
2285
ec_create_glow_level_up_att(actor * caster,int LOD)2286 extern "C" ec_reference ec_create_glow_level_up_att(actor* caster, int LOD)
2287 {
2288 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::GlowEffect::get_max_end_time()))
2289 return NULL;
2290 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2291 ret->caster = caster;
2292 ret->casterbone = get_actor_bone_id(caster, body_bottom_bone);
2293 set_vec3_actor_bone2(ret->position, ret->caster, ret->casterbone);
2294 ret->effect = new ec::GlowEffect(&eye_candy, &ret->dead, &ret->position, ec::GlowEffect::LEVEL_UP_ATT_GLOW, LOD);
2295 eye_candy.push_back_effect(ret->effect);
2296 return (ec_reference)ret;
2297 }
2298
ec_create_glow_level_up_def(actor * caster,int LOD)2299 extern "C" ec_reference ec_create_glow_level_up_def(actor* caster, int LOD)
2300 {
2301 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::GlowEffect::get_max_end_time()))
2302 return NULL;
2303 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2304 ret->caster = caster;
2305 ret->casterbone = get_actor_bone_id(caster, body_bottom_bone);
2306 set_vec3_actor_bone2(ret->position, ret->caster, ret->casterbone);
2307 ret->effect = new ec::GlowEffect(&eye_candy, &ret->dead, &ret->position, ec::GlowEffect::LEVEL_UP_DEF_GLOW, LOD);
2308 eye_candy.push_back_effect(ret->effect);
2309 return (ec_reference)ret;
2310 }
2311
ec_create_glow_level_up_default(actor * caster,int LOD)2312 extern "C" ec_reference ec_create_glow_level_up_default(actor* caster, int LOD)
2313 {
2314 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::GlowEffect::get_max_end_time()))
2315 return NULL;
2316 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2317 ret->caster = caster;
2318 ret->casterbone = get_actor_bone_id(caster, body_bottom_bone);
2319 set_vec3_actor_bone2(ret->position, ret->caster, ret->casterbone);
2320 ret->effect = new ec::GlowEffect(&eye_candy, &ret->dead, &ret->position, ec::GlowEffect::LEVEL_UP_DEFAULT_GLOW, LOD);
2321 eye_candy.push_back_effect(ret->effect);
2322 return (ec_reference)ret;
2323 }
2324
ec_create_glow_level_up_har(actor * caster,int LOD)2325 extern "C" ec_reference ec_create_glow_level_up_har(actor* caster, int LOD)
2326 {
2327 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::GlowEffect::get_max_end_time()))
2328 return NULL;
2329 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2330 ret->caster = caster;
2331 ret->casterbone = get_actor_bone_id(caster, body_bottom_bone);
2332 ret->position = ec::Vec3(caster->x_pos + X_OFFSET, ec_get_z(caster), -(caster->y_pos + Y_OFFSET));
2333 ret->effect = new ec::GlowEffect(&eye_candy, &ret->dead, &ret->position, ec::GlowEffect::LEVEL_UP_HAR_GLOW, LOD);
2334 eye_candy.push_back_effect(ret->effect);
2335 return (ec_reference)ret;
2336 }
2337
ec_create_glow_level_up_alc_left(actor * caster,int LOD)2338 extern "C" ec_reference ec_create_glow_level_up_alc_left(actor* caster, int LOD)
2339 {
2340 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::GlowEffect::get_max_end_time()))
2341 return NULL;
2342 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2343 ret->caster = caster;
2344 ret->casterbone = get_actor_bone_id(caster, hand_left_bone);
2345 set_vec3_actor_bone2(ret->position, ret->caster, ret->casterbone);
2346 ret->effect = new ec::GlowEffect(&eye_candy, &ret->dead, &ret->position, ec::GlowEffect::LEVEL_UP_ALC_GLOW_L, LOD);
2347 eye_candy.push_back_effect(ret->effect);
2348 return (ec_reference)ret;
2349 }
2350
ec_create_glow_level_up_alc_right(actor * caster,int LOD)2351 extern "C" ec_reference ec_create_glow_level_up_alc_right(actor* caster, int LOD)
2352 {
2353 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::GlowEffect::get_max_end_time()))
2354 return NULL;
2355 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2356 ret->caster = caster;
2357 ret->casterbone = get_actor_bone_id(caster, hand_right_bone);
2358 set_vec3_actor_bone2(ret->position, ret->caster, ret->casterbone);
2359 ret->effect = new ec::GlowEffect(&eye_candy, &ret->dead, &ret->position, ec::GlowEffect::LEVEL_UP_ALC_GLOW_R, LOD);
2360 eye_candy.push_back_effect(ret->effect);
2361 return (ec_reference)ret;
2362 }
2363
ec_create_glow_level_up_mag(actor * caster,int LOD)2364 extern "C" ec_reference ec_create_glow_level_up_mag(actor* caster, int LOD)
2365 {
2366 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::GlowEffect::get_max_end_time()))
2367 return NULL;
2368 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2369 ret->caster = caster;
2370 ret->casterbone = get_actor_bone_id(caster, body_bottom_bone);
2371 set_vec3_actor_bone2(ret->position, ret->caster, ret->casterbone);
2372 ret->effect = new ec::GlowEffect(&eye_candy, &ret->dead, &ret->position, ec::GlowEffect::LEVEL_UP_MAG_GLOW, LOD);
2373 eye_candy.push_back_effect(ret->effect);
2374 return (ec_reference)ret;
2375 }
2376
ec_create_glow_level_up_pot_left(actor * caster,int LOD)2377 extern "C" ec_reference ec_create_glow_level_up_pot_left(actor* caster, int LOD)
2378 {
2379 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::GlowEffect::get_max_end_time()))
2380 return NULL;
2381 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2382 ret->caster = caster;
2383 ret->casterbone = get_actor_bone_id(caster, hand_left_bone);
2384 set_vec3_actor_bone2(ret->position, ret->caster, ret->casterbone);
2385 ret->effect = new ec::GlowEffect(&eye_candy, &ret->dead, &ret->position, ec::GlowEffect::LEVEL_UP_POT_GLOW_L, LOD);
2386 eye_candy.push_back_effect(ret->effect);
2387 return (ec_reference)ret;
2388 }
2389
ec_create_glow_level_up_pot_right(actor * caster,int LOD)2390 extern "C" ec_reference ec_create_glow_level_up_pot_right(actor* caster, int LOD)
2391 {
2392 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::GlowEffect::get_max_end_time()))
2393 return NULL;
2394 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2395 ret->caster = caster;
2396 ret->casterbone = get_actor_bone_id(caster, hand_right_bone);
2397 set_vec3_actor_bone2(ret->position, ret->caster, ret->casterbone);
2398 ret->effect = new ec::GlowEffect(&eye_candy, &ret->dead, &ret->position, ec::GlowEffect::LEVEL_UP_POT_GLOW_R, LOD);
2399 eye_candy.push_back_effect(ret->effect);
2400 return (ec_reference)ret;
2401 }
2402
ec_create_glow_level_up_sum(actor * caster,int LOD)2403 extern "C" ec_reference ec_create_glow_level_up_sum(actor* caster, int LOD)
2404 {
2405 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::GlowEffect::get_max_end_time()))
2406 return NULL;
2407 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2408 ret->caster = caster;
2409 ret->casterbone = get_actor_bone_id(caster, head_bone);
2410 set_vec3_actor_bone2(ret->position, ret->caster, ret->casterbone);
2411 ret->effect = new ec::GlowEffect(&eye_candy, &ret->dead, &ret->position, ec::GlowEffect::LEVEL_UP_SUM_GLOW, LOD);
2412 eye_candy.push_back_effect(ret->effect);
2413 return (ec_reference)ret;
2414 }
2415
ec_create_glow_level_up_man_left(actor * caster,int LOD)2416 extern "C" ec_reference ec_create_glow_level_up_man_left(actor* caster, int LOD)
2417 {
2418 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::GlowEffect::get_max_end_time()))
2419 return NULL;
2420 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2421 ret->caster = caster;
2422 ret->casterbone = get_actor_bone_id(caster, hand_left_bone);
2423 set_vec3_actor_bone2(ret->position, ret->caster, ret->casterbone);
2424 ret->effect = new ec::GlowEffect(&eye_candy, &ret->dead, &ret->position, ec::GlowEffect::LEVEL_UP_MAN_GLOW_L, LOD);
2425 eye_candy.push_back_effect(ret->effect);
2426 return (ec_reference)ret;
2427 }
2428
ec_create_glow_level_up_man_right(actor * caster,int LOD)2429 extern "C" ec_reference ec_create_glow_level_up_man_right(actor* caster, int LOD)
2430 {
2431 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::GlowEffect::get_max_end_time()))
2432 return NULL;
2433 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2434 ret->caster = caster;
2435 ret->casterbone = get_actor_bone_id(caster, hand_right_bone);
2436 set_vec3_actor_bone2(ret->position, ret->caster, ret->casterbone);
2437 ret->effect = new ec::GlowEffect(&eye_candy, &ret->dead, &ret->position, ec::GlowEffect::LEVEL_UP_MAN_GLOW_R, LOD);
2438 eye_candy.push_back_effect(ret->effect);
2439 return (ec_reference)ret;
2440 }
2441
ec_create_glow_level_up_cra_left(actor * caster,int LOD)2442 extern "C" ec_reference ec_create_glow_level_up_cra_left(actor* caster, int LOD)
2443 {
2444 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::GlowEffect::get_max_end_time()))
2445 return NULL;
2446 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2447 ret->caster = caster;
2448 ret->casterbone = get_actor_bone_id(caster, hand_left_bone);
2449 set_vec3_actor_bone2(ret->position, ret->caster, ret->casterbone);
2450 ret->effect = new ec::GlowEffect(&eye_candy, &ret->dead, &ret->position, ec::GlowEffect::LEVEL_UP_CRA_GLOW_L, LOD);
2451 eye_candy.push_back_effect(ret->effect);
2452 return (ec_reference)ret;
2453 }
2454
ec_create_glow_level_up_cra_right(actor * caster,int LOD)2455 extern "C" ec_reference ec_create_glow_level_up_cra_right(actor* caster, int LOD)
2456 {
2457 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::GlowEffect::get_max_end_time()))
2458 return NULL;
2459 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2460 ret->caster = caster;
2461 ret->casterbone = get_actor_bone_id(caster, hand_right_bone);
2462 set_vec3_actor_bone2(ret->position, ret->caster, ret->casterbone);
2463 ret->effect = new ec::GlowEffect(&eye_candy, &ret->dead, &ret->position, ec::GlowEffect::LEVEL_UP_CRA_GLOW_R, LOD);
2464 eye_candy.push_back_effect(ret->effect);
2465 return (ec_reference)ret;
2466 }
2467
ec_create_glow_level_up_eng_left(actor * caster,int LOD)2468 extern "C" ec_reference ec_create_glow_level_up_eng_left(actor* caster, int LOD)
2469 {
2470 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::GlowEffect::get_max_end_time()))
2471 return NULL;
2472 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2473 ret->caster = caster;
2474 ret->casterbone = get_actor_bone_id(caster, hand_left_bone);
2475 set_vec3_actor_bone2(ret->position, ret->caster, ret->casterbone);
2476 ret->effect = new ec::GlowEffect(&eye_candy, &ret->dead, &ret->position, ec::GlowEffect::LEVEL_UP_ENG_GLOW_L, LOD);
2477 eye_candy.push_back_effect(ret->effect);
2478 return (ec_reference)ret;
2479 }
2480
ec_create_glow_level_up_eng_right(actor * caster,int LOD)2481 extern "C" ec_reference ec_create_glow_level_up_eng_right(actor* caster, int LOD)
2482 {
2483 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::GlowEffect::get_max_end_time()))
2484 return NULL;
2485 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2486 ret->caster = caster;
2487 ret->casterbone = get_actor_bone_id(caster, hand_right_bone);
2488 set_vec3_actor_bone2(ret->position, ret->caster, ret->casterbone);
2489 ret->effect = new ec::GlowEffect(&eye_candy, &ret->dead, &ret->position, ec::GlowEffect::LEVEL_UP_ENG_GLOW_R, LOD);
2490 eye_candy.push_back_effect(ret->effect);
2491 return (ec_reference)ret;
2492 }
2493
ec_create_glow_level_up_tai_left(actor * caster,int LOD)2494 extern "C" ec_reference ec_create_glow_level_up_tai_left(actor* caster, int LOD)
2495 {
2496 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::GlowEffect::get_max_end_time()))
2497 return NULL;
2498 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2499 ret->caster = caster;
2500 ret->casterbone = get_actor_bone_id(caster, hand_left_bone);
2501 set_vec3_actor_bone2(ret->position, ret->caster, ret->casterbone);
2502 ret->effect = new ec::GlowEffect(&eye_candy, &ret->dead, &ret->position, ec::GlowEffect::LEVEL_UP_TAI_GLOW_L, LOD);
2503 eye_candy.push_back_effect(ret->effect);
2504 return (ec_reference)ret;
2505 }
2506
ec_create_glow_level_up_tai_right(actor * caster,int LOD)2507 extern "C" ec_reference ec_create_glow_level_up_tai_right(actor* caster, int LOD)
2508 {
2509 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::GlowEffect::get_max_end_time()))
2510 return NULL;
2511 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2512 ret->caster = caster;
2513 ret->casterbone = get_actor_bone_id(caster, hand_right_bone);
2514 set_vec3_actor_bone2(ret->position, ret->caster, ret->casterbone);
2515 ret->effect = new ec::GlowEffect(&eye_candy, &ret->dead, &ret->position, ec::GlowEffect::LEVEL_UP_TAI_GLOW_R, LOD);
2516 eye_candy.push_back_effect(ret->effect);
2517 return (ec_reference)ret;
2518 }
2519
ec_create_glow_level_up_ran(actor * caster,int LOD)2520 extern "C" ec_reference ec_create_glow_level_up_ran(actor* caster, int LOD)
2521 {
2522 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::GlowEffect::get_max_end_time()))
2523 return NULL;
2524 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2525 ret->caster = caster;
2526 ret->casterbone = get_actor_bone_id(caster, head_bone);
2527 set_vec3_actor_bone2(ret->position, ret->caster, ret->casterbone);
2528 ret->effect = new ec::GlowEffect(&eye_candy, &ret->dead, &ret->position, ec::GlowEffect::LEVEL_UP_RAN_GLOW, LOD);
2529 eye_candy.push_back_effect(ret->effect);
2530 return (ec_reference)ret;
2531 }
2532
ec_create_ongoing_magic_protection2(actor * caster,float hue_adjust,float saturation_adjust,int LOD,float scale)2533 extern "C" ec_reference ec_create_ongoing_magic_protection2(actor *caster, float hue_adjust, float saturation_adjust, int LOD, float scale)
2534 {
2535 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2536 ret->caster = caster;
2537 ret->casterbone = get_actor_bone_id(caster, head_bone);
2538 set_vec3_actor_bone2(ret->position, ret->caster, ret->casterbone);
2539 ret->effect = new ec::OngoingEffect(&eye_candy, &ret->dead, &ret->position, hue_adjust, saturation_adjust, ec::OngoingEffect::OG_MAGIC_PROTECTION, LOD, scale, BUFF_MAGIC_PROTECTION);
2540 eye_candy.push_back_effect(ret->effect);
2541 return (ec_reference)ret;
2542 }
2543
ec_create_ongoing_shield2(actor * caster,float hue_adjust,float saturation_adjust,int LOD,float scale)2544 extern "C" ec_reference ec_create_ongoing_shield2(actor *caster, float hue_adjust, float saturation_adjust, int LOD, float scale)
2545 {
2546 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2547 ret->caster = caster;
2548 ret->casterbone = get_actor_bone_id(caster, head_bone);
2549 set_vec3_actor_bone2(ret->position, ret->caster, ret->casterbone);
2550 ret->effect = new ec::OngoingEffect(&eye_candy, &ret->dead, &ret->position, hue_adjust, saturation_adjust, ec::OngoingEffect::OG_SHIELD, LOD, scale, BUFF_SHIELD);
2551 eye_candy.push_back_effect(ret->effect);
2552 return (ec_reference)ret;
2553 }
2554
ec_create_ongoing_magic_immunity2(actor * caster,float hue_adjust,float saturation_adjust,int LOD,float scale)2555 extern "C" ec_reference ec_create_ongoing_magic_immunity2(actor *caster, float hue_adjust, float saturation_adjust, int LOD, float scale)
2556 {
2557 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2558 ret->caster = caster;
2559 ret->casterbone = get_actor_bone_id(caster, head_bone);
2560 set_vec3_actor_bone2(ret->position, ret->caster, ret->casterbone);
2561 ret->effect = new ec::OngoingEffect(&eye_candy, &ret->dead, &ret->position, hue_adjust, saturation_adjust, ec::OngoingEffect::OG_MAGIC_IMMUNITY, LOD, scale, BUFF_MAGIC_IMMUNITY);
2562 eye_candy.push_back_effect(ret->effect);
2563 return (ec_reference)ret;
2564 }
2565
ec_create_ongoing_poison2(actor * caster,float hue_adjust,float saturation_adjust,int LOD,float scale)2566 extern "C" ec_reference ec_create_ongoing_poison2(actor *caster, float hue_adjust, float saturation_adjust, int LOD, float scale)
2567 {
2568 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2569 ret->caster = caster;
2570 ret->casterbone = get_actor_bone_id(caster, body_bottom_bone);
2571 set_vec3_actor_bone2(ret->position, ret->caster, ret->casterbone);
2572 ret->effect = new ec::OngoingEffect(&eye_candy, &ret->dead, &ret->position, hue_adjust, saturation_adjust, ec::OngoingEffect::OG_POISON, LOD, scale, 0); // BUFF_POISON isn't defined yet!
2573 eye_candy.push_back_effect(ret->effect);
2574 return (ec_reference)ret;
2575 }
2576
ec_create_ongoing_harvesting2(actor * caster,float hue_adjust,float saturation_adjust,int LOD,float scale)2577 extern "C" ec_reference ec_create_ongoing_harvesting2(actor *caster, float hue_adjust, float saturation_adjust, int LOD, float scale)
2578 {
2579 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2580 ret->caster = caster;
2581 ret->casterbone = get_actor_bone_id(caster, hand_right_bone);
2582 set_vec3_actor_bone2(ret->position, ret->caster, ret->casterbone);
2583 ret->effect = new ec::OngoingEffect(&eye_candy, &ret->dead, &ret->position, hue_adjust, saturation_adjust, ec::OngoingEffect::OG_HARVEST, LOD, scale, 0); // BUFF_HARVEST isn't defined yet!
2584 eye_candy.push_back_effect(ret->effect);
2585 return (ec_reference)ret;
2586 }
2587
ec_create_selfmagic_heal2(actor * caster,int LOD)2588 extern "C" ec_reference ec_create_selfmagic_heal2(actor* caster, int LOD)
2589 {
2590 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::SelfMagicEffect::get_max_end_time()))
2591 return NULL;
2592 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2593 ret->caster = caster;
2594 ret->casterbone = get_actor_bone_id(caster, body_top_bone);
2595 set_vec3_actor_bone2(ret->position, ret->caster, ret->casterbone);
2596 ret->effect = new ec::SelfMagicEffect(&eye_candy, &ret->dead, &ret->position, ec::SelfMagicEffect::HEAL, LOD);
2597 eye_candy.push_back_effect(ret->effect);
2598 return (ec_reference)ret;
2599 }
2600
ec_create_selfmagic_magic_protection(float x,float y,float z,int LOD)2601 extern "C" ec_reference ec_create_selfmagic_magic_protection(float x, float y, float z, int LOD)
2602 {
2603 if (!ec_in_range(x, y, z, ec::SelfMagicEffect::get_max_end_time()))
2604 return NULL;
2605 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2606 ret->position = ec::Vec3(x + X_OFFSET, z, -(y + Y_OFFSET));
2607 ret->effect = new ec::SelfMagicEffect(&eye_candy, &ret->dead, &ret->position, ec::SelfMagicEffect::MAGIC_PROTECTION, LOD);
2608 eye_candy.push_back_effect(ret->effect);
2609 return (ec_reference)ret;
2610 }
2611
ec_create_selfmagic_magic_protection2(actor * caster,int LOD)2612 extern "C" ec_reference ec_create_selfmagic_magic_protection2(actor* caster, int LOD)
2613 {
2614 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::SelfMagicEffect::get_max_end_time()))
2615 return NULL;
2616 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2617 ret->caster = caster;
2618 ret->casterbone = get_actor_bone_id(caster, body_top_bone);
2619 set_vec3_actor_bone2(ret->position, ret->caster, ret->casterbone);
2620 ret->effect = new ec::SelfMagicEffect(&eye_candy, &ret->dead, &ret->position, ec::SelfMagicEffect::MAGIC_PROTECTION, LOD);
2621 eye_candy.push_back_effect(ret->effect);
2622 return (ec_reference)ret;
2623 }
2624
ec_create_selfmagic_shield(float x,float y,float z,int LOD)2625 extern "C" ec_reference ec_create_selfmagic_shield(float x, float y, float z, int LOD)
2626 {
2627 if (!ec_in_range(x, y, z, ec::SelfMagicEffect::get_max_end_time()))
2628 return NULL;
2629 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2630 ret->position = ec::Vec3(x + X_OFFSET, z, -(y + Y_OFFSET));
2631 ret->effect = new ec::SelfMagicEffect(&eye_candy, &ret->dead, &ret->position, ec::SelfMagicEffect::SHIELD, LOD);
2632 eye_candy.push_back_effect(ret->effect);
2633 return (ec_reference)ret;
2634 }
2635
ec_create_selfmagic_shield_generic(actor * caster,int LOD,special_effect_enum type)2636 extern "C" ec_reference ec_create_selfmagic_shield_generic(actor* caster, int LOD, special_effect_enum type)
2637 {
2638 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::SelfMagicEffect::get_max_end_time()))
2639 return NULL;
2640 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2641 ret->caster = caster;
2642 ret->casterbone = get_actor_bone_id(caster, body_bottom_bone);
2643 set_vec3_actor_bone2(ret->position, ret->caster, ret->casterbone);
2644 switch (type)
2645 {
2646 case SPECIAL_EFFECT_SHIELD:
2647 ret->effect = new ec::SelfMagicEffect(&eye_candy, &ret->dead, &ret->position, ec::SelfMagicEffect::SHIELD, LOD);
2648 break;
2649 case SPECIAL_EFFECT_HEATSHIELD:
2650 ret->effect = new ec::SelfMagicEffect(&eye_candy, &ret->dead, &ret->position, ec::SelfMagicEffect::HEATSHIELD, LOD);
2651 break;
2652 case SPECIAL_EFFECT_COLDSHIELD:
2653 ret->effect = new ec::SelfMagicEffect(&eye_candy, &ret->dead, &ret->position, ec::SelfMagicEffect::COLDSHIELD, LOD);
2654 break;
2655 case SPECIAL_EFFECT_RADIATIONSHIELD:
2656 ret->effect = new ec::SelfMagicEffect(&eye_candy, &ret->dead, &ret->position, ec::SelfMagicEffect::RADIATIONSHIELD, LOD);
2657 break;
2658 default:
2659 break;
2660 }
2661 eye_candy.push_back_effect(ret->effect);
2662 return (ec_reference)ret;
2663 }
2664
ec_create_selfmagic_restoration2(actor * caster,int LOD)2665 extern "C" ec_reference ec_create_selfmagic_restoration2(actor* caster, int LOD)
2666 {
2667 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::SelfMagicEffect::get_max_end_time()))
2668 return NULL;
2669 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2670 ret->caster = caster;
2671 ret->casterbone = get_actor_bone_id(caster, body_bottom_bone);
2672 set_vec3_actor_bone2(ret->position, ret->caster, ret->casterbone);
2673 ret->effect = new ec::SelfMagicEffect(&eye_candy, &ret->dead, &ret->position, ec::SelfMagicEffect::RESTORATION, LOD);
2674 eye_candy.push_back_effect(ret->effect);
2675 return (ec_reference)ret;
2676 }
2677
ec_create_selfmagic_bones_to_gold(float x,float y,float z,int LOD)2678 extern "C" ec_reference ec_create_selfmagic_bones_to_gold(float x, float y, float z, int LOD)
2679 {
2680 if (!ec_in_range(x, y, z, ec::SelfMagicEffect::get_max_end_time()))
2681 return NULL;
2682 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2683 ret->position = ec::Vec3(x + X_OFFSET, z, -(y + Y_OFFSET));
2684 ret->effect = new ec::SelfMagicEffect(&eye_candy, &ret->dead, &ret->position, ec::SelfMagicEffect::BONES_TO_GOLD, LOD);
2685 eye_candy.push_back_effect(ret->effect);
2686 return (ec_reference)ret;
2687 }
2688
ec_create_selfmagic_bones_to_gold2(actor * caster,int LOD)2689 extern "C" ec_reference ec_create_selfmagic_bones_to_gold2(actor* caster, int LOD)
2690 {
2691 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::SelfMagicEffect::get_max_end_time()))
2692 return NULL;
2693 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2694 ret->caster = caster;
2695 ret->casterbone = get_actor_bone_id(caster, body_bottom_bone);
2696 set_vec3_actor_bone2(ret->position, ret->caster, ret->casterbone);
2697 ret->effect = new ec::SelfMagicEffect(&eye_candy, &ret->dead, &ret->position, ec::SelfMagicEffect::BONES_TO_GOLD, LOD);
2698 eye_candy.push_back_effect(ret->effect);
2699 return (ec_reference)ret;
2700 }
2701
ec_create_selfmagic_teleport_to_the_portals_room2(actor * caster,int LOD)2702 extern "C" ec_reference ec_create_selfmagic_teleport_to_the_portals_room2(actor* caster, int LOD)
2703 {
2704 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::SelfMagicEffect::get_max_end_time()))
2705 return NULL;
2706 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2707 ret->position = ec::Vec3(caster->x_pos + X_OFFSET, ec_get_z(caster), -(caster->y_pos + Y_OFFSET));
2708 ret->effect = new ec::SelfMagicEffect(&eye_candy, &ret->dead, &ret->position, ec::SelfMagicEffect::TELEPORT_TO_THE_PORTALS_ROOM, LOD);
2709 eye_candy.push_back_effect(ret->effect);
2710 return (ec_reference)ret;
2711 }
2712
ec_create_selfmagic_magic_immunity2(actor * caster,int LOD)2713 extern "C" ec_reference ec_create_selfmagic_magic_immunity2(actor* caster, int LOD)
2714 {
2715 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::SelfMagicEffect::get_max_end_time()))
2716 return NULL;
2717 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2718 ret->caster = caster;
2719 ret->casterbone = get_actor_bone_id(caster, body_top_bone);
2720 set_vec3_actor_bone2(ret->position, ret->caster, ret->casterbone);
2721 ret->effect = new ec::SelfMagicEffect(&eye_candy, &ret->dead, &ret->position, ec::SelfMagicEffect::MAGIC_IMMUNITY, LOD);
2722 eye_candy.push_back_effect(ret->effect);
2723 return (ec_reference)ret;
2724 }
2725
ec_create_alert2(actor * caster,int LOD)2726 extern "C" ec_reference ec_create_alert2(actor* caster, int LOD)
2727 {
2728 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::SelfMagicEffect::get_max_end_time()))
2729 return NULL;
2730 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2731 ret->caster = caster;
2732 ret->position = ec::Vec3(caster->x_pos + X_OFFSET, ec_get_z(caster), -(caster->y_pos + Y_OFFSET));
2733 ret->effect = new ec::SelfMagicEffect(&eye_candy, &ret->dead, &ret->position, ec::SelfMagicEffect::ALERT, LOD);
2734 eye_candy.push_back_effect(ret->effect);
2735 return (ec_reference)ret;
2736 }
2737
ec_create_summon_rabbit2(actor * caster,int LOD)2738 extern "C" ec_reference ec_create_summon_rabbit2(actor* caster, int LOD)
2739 {
2740 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::SelfMagicEffect::get_max_end_time()))
2741 return NULL;
2742 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2743 ret->position = ec::Vec3(caster->x_pos + X_OFFSET, ec_get_z(caster), -(caster->y_pos + Y_OFFSET));
2744 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::RABBIT, LOD);
2745 eye_candy.push_back_effect(ret->effect);
2746 return (ec_reference)ret;
2747 }
2748
ec_create_summon_rat2(actor * caster,int LOD)2749 extern "C" ec_reference ec_create_summon_rat2(actor* caster, int LOD)
2750 {
2751 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::SelfMagicEffect::get_max_end_time()))
2752 return NULL;
2753 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2754 ret->position = ec::Vec3(caster->x_pos + X_OFFSET, ec_get_z(caster), -(caster->y_pos + Y_OFFSET));
2755 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::RAT, LOD);
2756 eye_candy.push_back_effect(ret->effect);
2757 return (ec_reference)ret;
2758 }
2759
ec_create_summon_beaver2(actor * caster,int LOD)2760 extern "C" ec_reference ec_create_summon_beaver2(actor* caster, int LOD)
2761 {
2762 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::SelfMagicEffect::get_max_end_time()))
2763 return NULL;
2764 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2765 ret->position = ec::Vec3(caster->x_pos + X_OFFSET, ec_get_z(caster), -(caster->y_pos + Y_OFFSET));
2766 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::BEAVER, LOD);
2767 eye_candy.push_back_effect(ret->effect);
2768 return (ec_reference)ret;
2769 }
2770
ec_create_summon_skunk2(actor * caster,int LOD)2771 extern "C" ec_reference ec_create_summon_skunk2(actor* caster, int LOD)
2772 {
2773 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::SelfMagicEffect::get_max_end_time()))
2774 return NULL;
2775 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2776 ret->position = ec::Vec3(caster->x_pos + X_OFFSET, ec_get_z(caster), -(caster->y_pos + Y_OFFSET));
2777 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::SKUNK, LOD);
2778 eye_candy.push_back_effect(ret->effect);
2779 return (ec_reference)ret;
2780 }
2781
ec_create_summon_racoon2(actor * caster,int LOD)2782 extern "C" ec_reference ec_create_summon_racoon2(actor* caster, int LOD)
2783 {
2784 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::SelfMagicEffect::get_max_end_time()))
2785 return NULL;
2786 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2787 ret->position = ec::Vec3(caster->x_pos + X_OFFSET, ec_get_z(caster), -(caster->y_pos + Y_OFFSET));
2788 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::RACOON, LOD);
2789 eye_candy.push_back_effect(ret->effect);
2790 return (ec_reference)ret;
2791 }
2792
ec_create_summon_deer2(actor * caster,int LOD)2793 extern "C" ec_reference ec_create_summon_deer2(actor* caster, int LOD)
2794 {
2795 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::SelfMagicEffect::get_max_end_time()))
2796 return NULL;
2797 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2798 ret->position = ec::Vec3(caster->x_pos + X_OFFSET, ec_get_z(caster), -(caster->y_pos + Y_OFFSET));
2799 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::DEER, LOD);
2800 eye_candy.push_back_effect(ret->effect);
2801 return (ec_reference)ret;
2802 }
2803
ec_create_summon_green_snake2(actor * caster,int LOD)2804 extern "C" ec_reference ec_create_summon_green_snake2(actor* caster, int LOD)
2805 {
2806 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::SelfMagicEffect::get_max_end_time()))
2807 return NULL;
2808 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2809 ret->position = ec::Vec3(caster->x_pos + X_OFFSET, ec_get_z(caster), -(caster->y_pos + Y_OFFSET));
2810 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::GREEN_SNAKE, LOD);
2811 eye_candy.push_back_effect(ret->effect);
2812 return (ec_reference)ret;
2813 }
2814
ec_create_summon_red_snake2(actor * caster,int LOD)2815 extern "C" ec_reference ec_create_summon_red_snake2(actor* caster, int LOD)
2816 {
2817 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::SelfMagicEffect::get_max_end_time()))
2818 return NULL;
2819 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2820 ret->position = ec::Vec3(caster->x_pos + X_OFFSET, ec_get_z(caster), -(caster->y_pos + Y_OFFSET));
2821 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::RED_SNAKE, LOD);
2822 eye_candy.push_back_effect(ret->effect);
2823 return (ec_reference)ret;
2824 }
2825
ec_create_summon_brown_snake2(actor * caster,int LOD)2826 extern "C" ec_reference ec_create_summon_brown_snake2(actor* caster, int LOD)
2827 {
2828 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::SelfMagicEffect::get_max_end_time()))
2829 return NULL;
2830 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2831 ret->position = ec::Vec3(caster->x_pos + X_OFFSET, ec_get_z(caster), -(caster->y_pos + Y_OFFSET));
2832 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::BROWN_SNAKE, LOD);
2833 eye_candy.push_back_effect(ret->effect);
2834 return (ec_reference)ret;
2835 }
2836
ec_create_summon_fox2(actor * caster,int LOD)2837 extern "C" ec_reference ec_create_summon_fox2(actor* caster, int LOD)
2838 {
2839 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::SelfMagicEffect::get_max_end_time()))
2840 return NULL;
2841 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2842 ret->position = ec::Vec3(caster->x_pos + X_OFFSET, ec_get_z(caster), -(caster->y_pos + Y_OFFSET));
2843 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::FOX, LOD);
2844 eye_candy.push_back_effect(ret->effect);
2845 return (ec_reference)ret;
2846 }
2847
ec_create_summon_boar2(actor * caster,int LOD)2848 extern "C" ec_reference ec_create_summon_boar2(actor* caster, int LOD)
2849 {
2850 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::SelfMagicEffect::get_max_end_time()))
2851 return NULL;
2852 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2853 ret->position = ec::Vec3(caster->x_pos + X_OFFSET, ec_get_z(caster), -(caster->y_pos + Y_OFFSET));
2854 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::BOAR, LOD);
2855 eye_candy.push_back_effect(ret->effect);
2856 return (ec_reference)ret;
2857 }
2858
ec_create_summon_wolf2(actor * caster,int LOD)2859 extern "C" ec_reference ec_create_summon_wolf2(actor* caster, int LOD)
2860 {
2861 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::SelfMagicEffect::get_max_end_time()))
2862 return NULL;
2863 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2864 ret->position = ec::Vec3(caster->x_pos + X_OFFSET, ec_get_z(caster), -(caster->y_pos + Y_OFFSET));
2865 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::WOLF, LOD);
2866 eye_candy.push_back_effect(ret->effect);
2867 return (ec_reference)ret;
2868 }
2869
ec_create_summon_skeleton2(actor * caster,int LOD)2870 extern "C" ec_reference ec_create_summon_skeleton2(actor* caster, int LOD)
2871 {
2872 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::SelfMagicEffect::get_max_end_time()))
2873 return NULL;
2874 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2875 ret->position = ec::Vec3(caster->x_pos + X_OFFSET, ec_get_z(caster), -(caster->y_pos + Y_OFFSET));
2876 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::SKELETON, LOD);
2877 eye_candy.push_back_effect(ret->effect);
2878 return (ec_reference)ret;
2879 }
2880
ec_create_summon_small_gargoyle2(actor * caster,int LOD)2881 extern "C" ec_reference ec_create_summon_small_gargoyle2(actor* caster, int LOD)
2882 {
2883 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::SelfMagicEffect::get_max_end_time()))
2884 return NULL;
2885 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2886 ret->position = ec::Vec3(caster->x_pos + X_OFFSET, ec_get_z(caster), -(caster->y_pos + Y_OFFSET));
2887 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::SMALL_GARGOYLE, LOD);
2888 eye_candy.push_back_effect(ret->effect);
2889 return (ec_reference)ret;
2890 }
2891
ec_create_summon_medium_gargoyle2(actor * caster,int LOD)2892 extern "C" ec_reference ec_create_summon_medium_gargoyle2(actor* caster, int LOD)
2893 {
2894 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::SelfMagicEffect::get_max_end_time()))
2895 return NULL;
2896 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2897 ret->position = ec::Vec3(caster->x_pos + X_OFFSET, ec_get_z(caster), -(caster->y_pos + Y_OFFSET));
2898 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::MEDIUM_GARGOYLE, LOD);
2899 eye_candy.push_back_effect(ret->effect);
2900 return (ec_reference)ret;
2901 }
2902
ec_create_summon_large_gargoyle2(actor * caster,int LOD)2903 extern "C" ec_reference ec_create_summon_large_gargoyle2(actor* caster, int LOD)
2904 {
2905 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::SelfMagicEffect::get_max_end_time()))
2906 return NULL;
2907 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2908 ret->position = ec::Vec3(caster->x_pos + X_OFFSET, ec_get_z(caster), -(caster->y_pos + Y_OFFSET));
2909 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::LARGE_GARGOYLE, LOD);
2910 eye_candy.push_back_effect(ret->effect);
2911 return (ec_reference)ret;
2912 }
2913
ec_create_summon_puma2(actor * caster,int LOD)2914 extern "C" ec_reference ec_create_summon_puma2(actor* caster, int LOD)
2915 {
2916 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::SelfMagicEffect::get_max_end_time()))
2917 return NULL;
2918 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2919 ret->position = ec::Vec3(caster->x_pos + X_OFFSET, ec_get_z(caster), -(caster->y_pos + Y_OFFSET));
2920 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::PUMA, LOD);
2921 eye_candy.push_back_effect(ret->effect);
2922 return (ec_reference)ret;
2923 }
2924
ec_create_summon_female_goblin2(actor * caster,int LOD)2925 extern "C" ec_reference ec_create_summon_female_goblin2(actor* caster, int LOD)
2926 {
2927 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::SelfMagicEffect::get_max_end_time()))
2928 return NULL;
2929 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2930 ret->position = ec::Vec3(caster->x_pos + X_OFFSET, ec_get_z(caster), -(caster->y_pos + Y_OFFSET));
2931 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::FEMALE_GOBLIN, LOD);
2932 eye_candy.push_back_effect(ret->effect);
2933 return (ec_reference)ret;
2934 }
2935
ec_create_summon_polar_bear2(actor * caster,int LOD)2936 extern "C" ec_reference ec_create_summon_polar_bear2(actor* caster, int LOD)
2937 {
2938 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::SelfMagicEffect::get_max_end_time()))
2939 return NULL;
2940 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2941 ret->position = ec::Vec3(caster->x_pos + X_OFFSET, ec_get_z(caster), -(caster->y_pos + Y_OFFSET));
2942 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::POLAR_BEAR, LOD);
2943 eye_candy.push_back_effect(ret->effect);
2944 return (ec_reference)ret;
2945 }
2946
ec_create_summon_bear2(actor * caster,int LOD)2947 extern "C" ec_reference ec_create_summon_bear2(actor* caster, int LOD)
2948 {
2949 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::SelfMagicEffect::get_max_end_time()))
2950 return NULL;
2951 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2952 ret->position = ec::Vec3(caster->x_pos + X_OFFSET, ec_get_z(caster), -(caster->y_pos + Y_OFFSET));
2953 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::BEAR, LOD);
2954 eye_candy.push_back_effect(ret->effect);
2955 return (ec_reference)ret;
2956 }
2957
ec_create_summon_armed_male_goblin2(actor * caster,int LOD)2958 extern "C" ec_reference ec_create_summon_armed_male_goblin2(actor* caster, int LOD)
2959 {
2960 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::SelfMagicEffect::get_max_end_time()))
2961 return NULL;
2962 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2963 ret->position = ec::Vec3(caster->x_pos + X_OFFSET, ec_get_z(caster), -(caster->y_pos + Y_OFFSET));
2964 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::ARMED_MALE_GOBLIN, LOD);
2965 eye_candy.push_back_effect(ret->effect);
2966 return (ec_reference)ret;
2967 }
2968
ec_create_summon_armed_skeleton2(actor * caster,int LOD)2969 extern "C" ec_reference ec_create_summon_armed_skeleton2(actor* caster, int LOD)
2970 {
2971 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::SelfMagicEffect::get_max_end_time()))
2972 return NULL;
2973 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2974 ret->position = ec::Vec3(caster->x_pos + X_OFFSET, ec_get_z(caster), -(caster->y_pos + Y_OFFSET));
2975 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::ARMED_SKELETON, LOD);
2976 eye_candy.push_back_effect(ret->effect);
2977 return (ec_reference)ret;
2978 }
2979
ec_create_summon_female_orc2(actor * caster,int LOD)2980 extern "C" ec_reference ec_create_summon_female_orc2(actor* caster, int LOD)
2981 {
2982 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::SelfMagicEffect::get_max_end_time()))
2983 return NULL;
2984 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2985 ret->position = ec::Vec3(caster->x_pos + X_OFFSET, ec_get_z(caster), -(caster->y_pos + Y_OFFSET));
2986 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::FEMALE_ORC, LOD);
2987 eye_candy.push_back_effect(ret->effect);
2988 return (ec_reference)ret;
2989 }
2990
ec_create_summon_male_orc2(actor * caster,int LOD)2991 extern "C" ec_reference ec_create_summon_male_orc2(actor* caster, int LOD)
2992 {
2993 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::SelfMagicEffect::get_max_end_time()))
2994 return NULL;
2995 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
2996 ret->position = ec::Vec3(caster->x_pos + X_OFFSET, ec_get_z(caster), -(caster->y_pos + Y_OFFSET));
2997 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::MALE_ORC, LOD);
2998 eye_candy.push_back_effect(ret->effect);
2999 return (ec_reference)ret;
3000 }
3001
ec_create_summon_armed_female_orc2(actor * caster,int LOD)3002 extern "C" ec_reference ec_create_summon_armed_female_orc2(actor* caster, int LOD)
3003 {
3004 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::SelfMagicEffect::get_max_end_time()))
3005 return NULL;
3006 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
3007 ret->position = ec::Vec3(caster->x_pos + X_OFFSET, ec_get_z(caster), -(caster->y_pos + Y_OFFSET));
3008 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::ARMED_FEMALE_ORC, LOD);
3009 eye_candy.push_back_effect(ret->effect);
3010 return (ec_reference)ret;
3011 }
3012
ec_create_summon_armed_male_orc2(actor * caster,int LOD)3013 extern "C" ec_reference ec_create_summon_armed_male_orc2(actor* caster, int LOD)
3014 {
3015 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::SelfMagicEffect::get_max_end_time()))
3016 return NULL;
3017 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
3018 ret->position = ec::Vec3(caster->x_pos + X_OFFSET, ec_get_z(caster), -(caster->y_pos + Y_OFFSET));
3019 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::ARMED_MALE_ORC, LOD);
3020 eye_candy.push_back_effect(ret->effect);
3021 return (ec_reference)ret;
3022 }
3023
ec_create_summon_cyclops2(actor * caster,int LOD)3024 extern "C" ec_reference ec_create_summon_cyclops2(actor* caster, int LOD)
3025 {
3026 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::SelfMagicEffect::get_max_end_time()))
3027 return NULL;
3028 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
3029 ret->position = ec::Vec3(caster->x_pos + X_OFFSET, ec_get_z(caster), -(caster->y_pos + Y_OFFSET));
3030 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::CYCLOPS, LOD);
3031 eye_candy.push_back_effect(ret->effect);
3032 return (ec_reference)ret;
3033 }
3034
ec_create_summon_fluffy2(actor * caster,int LOD)3035 extern "C" ec_reference ec_create_summon_fluffy2(actor* caster, int LOD)
3036 {
3037 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::SelfMagicEffect::get_max_end_time()))
3038 return NULL;
3039 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
3040 ret->position = ec::Vec3(caster->x_pos + X_OFFSET, ec_get_z(caster), -(caster->y_pos + Y_OFFSET));
3041 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::FLUFFY, LOD);
3042 eye_candy.push_back_effect(ret->effect);
3043 return (ec_reference)ret;
3044 }
3045
ec_create_summon_phantom_warrior2(actor * caster,int LOD)3046 extern "C" ec_reference ec_create_summon_phantom_warrior2(actor* caster, int LOD)
3047 {
3048 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::SelfMagicEffect::get_max_end_time()))
3049 return NULL;
3050 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
3051 ret->position = ec::Vec3(caster->x_pos + X_OFFSET, ec_get_z(caster), -(caster->y_pos + Y_OFFSET));
3052 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::PHANTOM_WARRIOR, LOD);
3053 eye_candy.push_back_effect(ret->effect);
3054 return (ec_reference)ret;
3055 }
3056
ec_create_summon_mountain_chimeran2(actor * caster,int LOD)3057 extern "C" ec_reference ec_create_summon_mountain_chimeran2(actor* caster, int LOD)
3058 {
3059 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::SelfMagicEffect::get_max_end_time()))
3060 return NULL;
3061 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
3062 ret->position = ec::Vec3(caster->x_pos + X_OFFSET, ec_get_z(caster), -(caster->y_pos + Y_OFFSET));
3063 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::MOUNTAIN_CHIMERAN, LOD);
3064 eye_candy.push_back_effect(ret->effect);
3065 return (ec_reference)ret;
3066 }
3067
ec_create_summon_yeti2(actor * caster,int LOD)3068 extern "C" ec_reference ec_create_summon_yeti2(actor* caster, int LOD)
3069 {
3070 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::SelfMagicEffect::get_max_end_time()))
3071 return NULL;
3072 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
3073 ret->position = ec::Vec3(caster->x_pos + X_OFFSET, ec_get_z(caster), -(caster->y_pos + Y_OFFSET));
3074 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::YETI, LOD);
3075 eye_candy.push_back_effect(ret->effect);
3076 return (ec_reference)ret;
3077 }
3078
ec_create_summon_arctic_chimeran2(actor * caster,int LOD)3079 extern "C" ec_reference ec_create_summon_arctic_chimeran2(actor* caster, int LOD)
3080 {
3081 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::SelfMagicEffect::get_max_end_time()))
3082 return NULL;
3083 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
3084 ret->position = ec::Vec3(caster->x_pos + X_OFFSET, ec_get_z(caster), -(caster->y_pos + Y_OFFSET));
3085 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::ARCTIC_CHIMERAN, LOD);
3086 eye_candy.push_back_effect(ret->effect);
3087 return (ec_reference)ret;
3088 }
3089
ec_create_summon_giant2(actor * caster,int LOD)3090 extern "C" ec_reference ec_create_summon_giant2(actor* caster, int LOD)
3091 {
3092 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::SelfMagicEffect::get_max_end_time()))
3093 return NULL;
3094 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
3095 ret->position = ec::Vec3(caster->x_pos + X_OFFSET, ec_get_z(caster), -(caster->y_pos + Y_OFFSET));
3096 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::GIANT, LOD);
3097 eye_candy.push_back_effect(ret->effect);
3098 return (ec_reference)ret;
3099 }
3100
ec_create_summon_giant_snake2(actor * caster,int LOD)3101 extern "C" ec_reference ec_create_summon_giant_snake2(actor* caster, int LOD)
3102 {
3103 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::SelfMagicEffect::get_max_end_time()))
3104 return NULL;
3105 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
3106 ret->position = ec::Vec3(caster->x_pos + X_OFFSET, ec_get_z(caster), -(caster->y_pos + Y_OFFSET));
3107 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::GIANT_SNAKE, LOD);
3108 eye_candy.push_back_effect(ret->effect);
3109 return (ec_reference)ret;
3110 }
3111
ec_create_summon_spider2(actor * caster,int LOD)3112 extern "C" ec_reference ec_create_summon_spider2(actor* caster, int LOD)
3113 {
3114 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::SelfMagicEffect::get_max_end_time()))
3115 return NULL;
3116 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
3117 ret->position = ec::Vec3(caster->x_pos + X_OFFSET, ec_get_z(caster), -(caster->y_pos + Y_OFFSET));
3118 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::SPIDER, LOD);
3119 eye_candy.push_back_effect(ret->effect);
3120 return (ec_reference)ret;
3121 }
3122
ec_create_summon_tiger2(actor * caster,int LOD)3123 extern "C" ec_reference ec_create_summon_tiger2(actor* caster, int LOD)
3124 {
3125 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::SelfMagicEffect::get_max_end_time()))
3126 return NULL;
3127 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
3128 ret->position = ec::Vec3(caster->x_pos + X_OFFSET, ec_get_z(caster), -(caster->y_pos + Y_OFFSET));
3129 ret->effect = new ec::SummonEffect(&eye_candy, &ret->dead, &ret->position, ec::SummonEffect::TIGER, LOD);
3130 eye_candy.push_back_effect(ret->effect);
3131 return (ec_reference)ret;
3132 }
3133
ec_create_sword_cutlass(actor * _actor,int LOD)3134 extern "C" ec_reference ec_create_sword_cutlass(actor* _actor, int LOD)
3135 {
3136 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
3137 ret->caster = _actor;
3138 get_sword_positions(_actor, ret->position, ret->position2);
3139 ret->effect = new ec::SwordEffect(&eye_candy, &ret->dead, &ret->position, &ret->position2, ec::SwordEffect::CUTLASS, LOD);
3140 eye_candy.push_back_effect(ret->effect);
3141 return (ec_reference)ret;
3142 }
3143
ec_create_sword_emerald_claymore(actor * _actor,int LOD)3144 extern "C" ec_reference ec_create_sword_emerald_claymore(actor* _actor, int LOD)
3145 {
3146 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
3147 ret->caster = _actor;
3148 get_sword_positions(_actor, ret->position, ret->position2);
3149 ret->effect = new ec::SwordEffect(&eye_candy, &ret->dead, &ret->position, &ret->position2, ec::SwordEffect::EMERALD_CLAYMORE, LOD);
3150 eye_candy.push_back_effect(ret->effect);
3151 return (ec_reference)ret;
3152 }
3153
ec_create_sword_sunbreaker(actor * _actor,int LOD)3154 extern "C" ec_reference ec_create_sword_sunbreaker(actor* _actor, int LOD)
3155 {
3156 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
3157 ret->caster = _actor;
3158 get_sword_positions(_actor, ret->position, ret->position2);
3159 ret->effect = new ec::SwordEffect(&eye_candy, &ret->dead, &ret->position, &ret->position2, ec::SwordEffect::SUNBREAKER, LOD);
3160 eye_candy.push_back_effect(ret->effect);
3161 return (ec_reference)ret;
3162 }
3163
ec_create_staff_of_the_mage(actor * _actor,int LOD)3164 extern "C" ec_reference ec_create_staff_of_the_mage(actor* _actor, int LOD)
3165 {
3166 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
3167 ret->caster = _actor;
3168 get_staff_position(_actor, ret->position);
3169 ret->effect = new ec::StaffEffect(&eye_candy, &ret->dead, &ret->position, ec::StaffEffect::STAFF_OF_THE_MAGE, LOD);
3170 eye_candy.push_back_effect(ret->effect);
3171 return (ec_reference)ret;
3172 }
3173
ec_create_staff_of_protection(actor * _actor,int LOD)3174 extern "C" ec_reference ec_create_staff_of_protection(actor* _actor, int LOD)
3175 {
3176 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
3177 ret->caster = _actor;
3178 get_staff_position(_actor, ret->position);
3179 ret->effect = new ec::StaffEffect(&eye_candy, &ret->dead, &ret->position, ec::StaffEffect::STAFF_OF_PROTECTION, LOD);
3180 eye_candy.push_back_effect(ret->effect);
3181 return (ec_reference)ret;
3182 }
3183
ec_create_sword_orc_slayer(actor * _actor,int LOD)3184 extern "C" ec_reference ec_create_sword_orc_slayer(actor* _actor, int LOD)
3185 {
3186 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
3187 ret->caster = _actor;
3188 get_sword_positions(_actor, ret->position, ret->position2);
3189 ret->effect = new ec::SwordEffect(&eye_candy, &ret->dead, &ret->position, &ret->position2, ec::SwordEffect::ORC_SLAYER, LOD);
3190 eye_candy.push_back_effect(ret->effect);
3191 return (ec_reference)ret;
3192 }
3193
ec_create_sword_eagle_wing(actor * _actor,int LOD)3194 extern "C" ec_reference ec_create_sword_eagle_wing(actor* _actor, int LOD)
3195 {
3196 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
3197 ret->caster = _actor;
3198 get_sword_positions(_actor, ret->position, ret->position2);
3199 ret->effect = new ec::SwordEffect(&eye_candy, &ret->dead, &ret->position, &ret->position2, ec::SwordEffect::EAGLE_WING, LOD);
3200 eye_candy.push_back_effect(ret->effect);
3201 return (ec_reference)ret;
3202 }
3203
ec_create_sword_jagged_saber(actor * _actor,int LOD)3204 extern "C" ec_reference ec_create_sword_jagged_saber(actor* _actor, int LOD)
3205 {
3206 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
3207 ret->caster = _actor;
3208 get_sword_positions(_actor, ret->position, ret->position2);
3209 ret->effect = new ec::SwordEffect(&eye_candy, &ret->dead, &ret->position, &ret->position2, ec::SwordEffect::JAGGED_SABER, LOD);
3210 eye_candy.push_back_effect(ret->effect);
3211 return (ec_reference)ret;
3212 }
3213
ec_create_sword_of_fire(actor * _actor,int LOD)3214 extern "C" ec_reference ec_create_sword_of_fire(actor* _actor, int LOD)
3215 {
3216 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
3217 ret->caster = _actor;
3218 get_sword_positions(_actor, ret->position, ret->position2);
3219 ret->effect = new ec::SwordEffect(&eye_candy, &ret->dead, &ret->position, &ret->position2, ec::SwordEffect::SWORD_OF_FIRE, LOD);
3220 eye_candy.push_back_effect(ret->effect);
3221 return (ec_reference)ret;
3222 }
3223
ec_create_sword_of_ice(actor * _actor,int LOD)3224 extern "C" ec_reference ec_create_sword_of_ice(actor* _actor, int LOD)
3225 {
3226 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
3227 ret->caster = _actor;
3228 get_sword_positions(_actor, ret->position, ret->position2);
3229 ret->effect = new ec::SwordEffect(&eye_candy, &ret->dead, &ret->position, &ret->position2, ec::SwordEffect::SWORD_OF_ICE, LOD);
3230 eye_candy.push_back_effect(ret->effect);
3231 return (ec_reference)ret;
3232 }
3233
ec_create_sword_of_magic(actor * _actor,int LOD)3234 extern "C" ec_reference ec_create_sword_of_magic(actor* _actor, int LOD)
3235 {
3236 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
3237 ret->caster = _actor;
3238 get_sword_positions(_actor, ret->position, ret->position2);
3239 ret->effect = new ec::SwordEffect(&eye_candy, &ret->dead, &ret->position, &ret->position2, ec::SwordEffect::SWORD_OF_MAGIC, LOD);
3240 eye_candy.push_back_effect(ret->effect);
3241 return (ec_reference)ret;
3242 }
3243
ec_create_targetmagic_remote_heal2(actor * caster,actor * target,int LOD)3244 extern "C" ec_reference ec_create_targetmagic_remote_heal2(actor* caster, actor* target, int LOD)
3245 {
3246 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::TargetMagicEffect::get_max_end_time()))
3247 return NULL;
3248 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
3249 ret->caster = caster;
3250 ret->target = target;
3251 ret->casterbone = get_actor_bone_id(caster, hand_right_bone);
3252 ret->targetbone = get_actor_bone_id(target, body_bottom_bone);
3253 set_vec3_actor_bone2(ret->position, caster, ret->casterbone);
3254 set_vec3_target_bone2(ret->position2, target, ret->targetbone);
3255 ret->effect = new ec::TargetMagicEffect(&eye_candy, &ret->dead, &ret->position, &ret->position2, ec::TargetMagicEffect::REMOTE_HEAL, &general_obstructions_list, LOD);
3256 eye_candy.push_back_effect(ret->effect);
3257 return (ec_reference)ret;
3258 }
3259
ec_create_targetmagic_poison2(actor * caster,actor * target,int LOD)3260 extern "C" ec_reference ec_create_targetmagic_poison2(actor* caster, actor* target, int LOD)
3261 {
3262 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::TargetMagicEffect::get_max_end_time()))
3263 return NULL;
3264 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
3265 ret->caster = caster;
3266 ret->casterbone = get_actor_bone_id(caster, hand_right_bone);;
3267 ret->target = target;
3268 set_vec3_actor_bone(ret->position, caster, ret->casterbone, ec::Vec3(0.0, 0.0, 0.0));
3269 ret->position2 = ec::Vec3(target->x_pos, ec_get_z(target), -target->y_pos);
3270 ret->effect = new ec::TargetMagicEffect(&eye_candy, &ret->dead, &ret->position, &ret->position2, ec::TargetMagicEffect::POISON, &general_obstructions_list, LOD);
3271 eye_candy.push_back_effect(ret->effect);
3272 return (ec_reference)ret;
3273 }
3274
ec_create_targetmagic_teleport_to_range2(actor * caster,actor * target,int LOD)3275 extern "C" ec_reference ec_create_targetmagic_teleport_to_range2(actor* caster, actor* target, int LOD)
3276 {
3277 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::TargetMagicEffect::get_max_end_time()))
3278 return NULL;
3279 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
3280 ret->caster = caster;
3281 ret->target = target;
3282 ret->position = ec::Vec3(caster->x_pos + X_OFFSET, ec_get_z(caster), -(caster->y_pos + Y_OFFSET));
3283 ret->position2 = ec::Vec3(target->x_pos + X_OFFSET, ec_get_z(target), -(target->y_pos + Y_OFFSET));
3284 ret->effect = new ec::TargetMagicEffect(&eye_candy, &ret->dead, &ret->position, &ret->position2, ec::TargetMagicEffect::TELEPORT_TO_RANGE, &general_obstructions_list, LOD);
3285 eye_candy.push_back_effect(ret->effect);
3286 return (ec_reference)ret;
3287 }
3288
ec_create_targetmagic_harm2(actor * caster,actor * target,int LOD)3289 extern "C" ec_reference ec_create_targetmagic_harm2(actor* caster, actor* target, int LOD)
3290 {
3291 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::TargetMagicEffect::get_max_end_time()))
3292 return NULL;
3293 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
3294 ret->caster = caster;
3295 ret->casterbone = get_actor_bone_id(caster, hand_right_bone);
3296 ret->target = target;
3297 set_vec3_actor_bone(ret->position, caster, ret->casterbone, ec::Vec3(0.0, 0.0, 0.0));
3298 ret->position2 = ec::Vec3(target->x_pos, ec_get_z(target), -target->y_pos);
3299 ret->effect = new ec::TargetMagicEffect(&eye_candy, &ret->dead, &ret->position, &ret->position2, ec::TargetMagicEffect::HARM, &general_obstructions_list, LOD);
3300 eye_candy.push_back_effect(ret->effect);
3301 return (ec_reference)ret;
3302 }
3303
ec_create_targetmagic_life_drain2(actor * caster,actor * target,int LOD)3304 extern "C" ec_reference ec_create_targetmagic_life_drain2(actor* caster, actor* target, int LOD)
3305 {
3306 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::TargetMagicEffect::get_max_end_time()))
3307 return NULL;
3308 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
3309 ret->caster = caster;
3310 ret->casterbone = get_actor_bone_id(caster, head_bone); // spell target
3311 ret->target = target;
3312 ret->targetbone = get_actor_bone_id(target, head_bone); // spell source
3313 set_vec3_actor_bone2(ret->position, caster, ret->casterbone);
3314 set_vec3_target_bone2(ret->position2, target, ret->targetbone);
3315 ret->effect = new ec::TargetMagicEffect(&eye_candy, &ret->dead, &ret->position, &ret->position2, ec::TargetMagicEffect::LIFE_DRAIN, &general_obstructions_list, LOD);
3316 eye_candy.push_back_effect(ret->effect);
3317 return (ec_reference)ret;
3318 }
3319
ec_create_targetmagic_drain_mana2(actor * caster,actor * target,int LOD)3320 extern "C" ec_reference ec_create_targetmagic_drain_mana2(actor* caster, actor* target, int LOD)
3321 {
3322 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::TargetMagicEffect::get_max_end_time()))
3323 return NULL;
3324 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
3325 ret->caster = caster;
3326 ret->casterbone = get_actor_bone_id(caster, head_bone); // spell target
3327 ret->target = target;
3328 ret->targetbone = get_actor_bone_id(target, head_bone); // spell source
3329 set_vec3_actor_bone2(ret->position, caster, ret->casterbone);
3330 set_vec3_target_bone2(ret->position2, target, ret->targetbone);
3331 ret->effect = new ec::TargetMagicEffect(&eye_candy, &ret->dead, &ret->position, &ret->position2, ec::TargetMagicEffect::DRAIN_MANA, &general_obstructions_list, LOD);
3332 eye_candy.push_back_effect(ret->effect);
3333 return (ec_reference)ret;
3334 }
3335
ec_create_mine_detonate(float x,float y,float z,int mine_type,int LOD)3336 extern "C" ec_reference ec_create_mine_detonate(float x, float y, float z, int mine_type, int LOD)
3337 {
3338 if (!ec_in_range(x, y, z, ec::MineEffect::get_max_end_time()))
3339 return NULL;
3340 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
3341 ret->position = ec::Vec3(x, z, -y);
3342 if (mine_type == MINE_TYPE_SMALL_MINE)
3343 {
3344 ret->effect = new ec::MineEffect(&eye_candy, &ret->dead, &ret->position, ec::MineEffect::DETONATE_TYPE1_SMALL, LOD);
3345 }
3346 else if (mine_type == MINE_TYPE_MEDIUM_MINE)
3347 {
3348 ret->effect = new ec::MineEffect(&eye_candy, &ret->dead, &ret->position, ec::MineEffect::DETONATE_TYPE1_MEDIUM, LOD);
3349 }
3350 else if (mine_type == MINE_TYPE_HIGH_EXPLOSIVE_MINE)
3351 {
3352 ret->effect = new ec::MineEffect(&eye_candy, &ret->dead, &ret->position, ec::MineEffect::DETONATE_TYPE1_LARGE, LOD);
3353 }
3354 else if (mine_type == MINE_TYPE_TRAP)
3355 {
3356 ret->effect = new ec::MineEffect(&eye_candy, &ret->dead, &ret->position, ec::MineEffect::DETONATE_TRAP, LOD);
3357 }
3358 else if (mine_type == MINE_TYPE_CALTROP)
3359 {
3360 ret->effect = new ec::MineEffect(&eye_candy, &ret->dead, &ret->position, ec::MineEffect::DETONATE_CALTROP, LOD);
3361 }
3362 else if (mine_type == MINE_TYPE_POISONED_CALTROP)
3363 {
3364 ret->effect = new ec::MineEffect(&eye_candy, &ret->dead, &ret->position, ec::MineEffect::DETONATE_CALTROP_POISON, LOD);
3365 }
3366 else if (mine_type == MINE_TYPE_MANA_DRAINER)
3367 {
3368 ret->effect = new ec::MineEffect(&eye_candy, &ret->dead, &ret->position, ec::MineEffect::DETONATE_MANA_DRAINER, LOD);
3369 }
3370 else if (mine_type == MINE_TYPE_MANA_BURNER)
3371 {
3372 ret->effect = new ec::MineEffect(&eye_candy, &ret->dead, &ret->position, ec::MineEffect::DETONATE_MANA_BURNER, LOD);
3373 }
3374 else if (mine_type == MINE_TYPE_UNINVIZIBILIZER)
3375 {
3376 ret->effect = new ec::MineEffect(&eye_candy, &ret->dead, &ret->position, ec::MineEffect::DETONATE_UNINVIZIBILIZER, LOD);
3377 }
3378 else if (mine_type == MINE_TYPE_MAGIC_IMMUNITY_REMOVAL)
3379 {
3380 ret->effect = new ec::MineEffect(&eye_candy, &ret->dead, &ret->position, ec::MineEffect::DETONATE_MAGIC_IMMUNITY_REMOVAL, LOD);
3381 }
3382 eye_candy.push_back_effect(ret->effect);
3383 return (ec_reference)ret;
3384 }
3385
ec_create_mine_detonate2(actor * caster,int mine_type,int LOD)3386 extern "C" ec_reference ec_create_mine_detonate2(actor* caster, int mine_type, int LOD)
3387 {
3388 if (!ec_in_range(caster->x_pos, caster->y_pos, ec_get_z(caster), ec::MineEffect::get_max_end_time()))
3389 return NULL;
3390 ec_internal_reference* ret = (ec_internal_reference*)ec_create_generic();
3391 ret->caster = caster;
3392 ret->casterbone = get_actor_bone_id(caster, head_bone);
3393 set_vec3_actor_bone2(ret->position, ret->caster, ret->casterbone);
3394 ret->position = ec::Vec3(ret->position.x, ec_get_z(caster), ret->position.z);
3395 if (mine_type == MINE_TYPE_SMALL_MINE)
3396 {
3397 ret->effect = new ec::MineEffect(&eye_candy, &ret->dead, &ret->position, ec::MineEffect::DETONATE_TYPE1_SMALL, LOD);
3398 }
3399 else if (mine_type == MINE_TYPE_MEDIUM_MINE)
3400 {
3401 ret->effect = new ec::MineEffect(&eye_candy, &ret->dead, &ret->position, ec::MineEffect::DETONATE_TYPE1_MEDIUM, LOD);
3402 }
3403 else if (mine_type == MINE_TYPE_HIGH_EXPLOSIVE_MINE)
3404 {
3405 ret->effect = new ec::MineEffect(&eye_candy, &ret->dead, &ret->position, ec::MineEffect::DETONATE_TYPE1_LARGE, LOD);
3406 }
3407 else if (mine_type == MINE_TYPE_TRAP)
3408 {
3409 ret->effect = new ec::MineEffect(&eye_candy, &ret->dead, &ret->position, ec::MineEffect::DETONATE_TRAP, LOD);
3410 }
3411 else if (mine_type == MINE_TYPE_CALTROP)
3412 {
3413 ret->effect = new ec::MineEffect(&eye_candy, &ret->dead, &ret->position, ec::MineEffect::DETONATE_CALTROP, LOD);
3414 }
3415 else if (mine_type == MINE_TYPE_POISONED_CALTROP)
3416 {
3417 ret->effect = new ec::MineEffect(&eye_candy, &ret->dead, &ret->position, ec::MineEffect::DETONATE_CALTROP_POISON, LOD);
3418 }
3419 else if (mine_type == MINE_TYPE_MANA_DRAINER)
3420 {
3421 ret->effect = new ec::MineEffect(&eye_candy, &ret->dead, &ret->position, ec::MineEffect::DETONATE_MANA_DRAINER, LOD);
3422 }
3423 else if (mine_type == MINE_TYPE_MANA_BURNER)
3424 {
3425 ret->effect = new ec::MineEffect(&eye_candy, &ret->dead, &ret->position, ec::MineEffect::DETONATE_MANA_BURNER, LOD);
3426 }
3427 else if (mine_type == MINE_TYPE_UNINVIZIBILIZER)
3428 {
3429 ret->effect = new ec::MineEffect(&eye_candy, &ret->dead, &ret->position, ec::MineEffect::DETONATE_UNINVIZIBILIZER, LOD);
3430 }
3431 else if (mine_type == MINE_TYPE_MAGIC_IMMUNITY_REMOVAL)
3432 {
3433 ret->effect = new ec::MineEffect(&eye_candy, &ret->dead, &ret->position, ec::MineEffect::DETONATE_MAGIC_IMMUNITY_REMOVAL, LOD);
3434 }
3435 eye_candy.push_back_effect(ret->effect);
3436 return (ec_reference)ret;
3437 }
3438
ec_create_missile_effect(int missile_id,int LOD,int hitOrMiss)3439 extern "C" ec_reference ec_create_missile_effect(int missile_id, int LOD, int hitOrMiss)
3440 {
3441 missile *mis = get_missile_ptr_from_id(missile_id);
3442 ec_internal_reference* ret;
3443
3444 if (mis == NULL ||
3445 missiles_defs[mis->type].effect < MAGIC_MISSILE ||
3446 missiles_defs[mis->type].effect> EXPLOSIVE_MISSILE
3447 )
3448 return NULL;
3449
3450 ret = (ec_internal_reference*)ec_create_generic();
3451 ret->missile_id = missile_id;
3452 ret->position.x = mis->position[0];
3453 ret->position.y = mis->position[2];
3454 ret->position.z = -mis->position[1];
3455
3456 switch(missiles_defs[mis->type].effect)
3457 {
3458 case MAGIC_MISSILE:
3459 ret->effect = new ec::MissileEffect(&eye_candy, &ret->dead, &ret->position, ec::MissileEffect::MAGIC, LOD, hitOrMiss);
3460 break;
3461
3462 case FIRE_MISSILE:
3463 ret->effect = new ec::MissileEffect(&eye_candy, &ret->dead, &ret->position, ec::MissileEffect::FIRE, LOD, hitOrMiss);
3464 break;
3465
3466 case ICE_MISSILE:
3467 ret->effect = new ec::MissileEffect(&eye_candy, &ret->dead, &ret->position, ec::MissileEffect::ICE, LOD, hitOrMiss);
3468 break;
3469
3470 case EXPLOSIVE_MISSILE:
3471 ret->effect = new ec::MissileEffect(&eye_candy, &ret->dead, &ret->position, ec::MissileEffect::EXPLOSIVE, LOD, hitOrMiss);
3472 break;
3473
3474 default:
3475 delete ret;
3476 return NULL;
3477 }
3478
3479 eye_candy.push_back_effect(ret->effect);
3480 return (ec_reference)ret;
3481 }
3482
3483 /* stop or restart the harvesting eye candy effect depending on the harvesting state */
check_harvesting_effect()3484 extern "C" void check_harvesting_effect()
3485 {
3486 /* if the harvesting effect is on but we're not harvesting, stop it */
3487 if ((!now_harvesting() || !use_harvesting_eye_candy) && (harvesting_effect_reference != NULL))
3488 {
3489 ec_recall_effect(harvesting_effect_reference);
3490 harvesting_effect_reference = NULL;
3491 }
3492 /* but if we are harvesting but there is no effect, start it if wanted */
3493 else if (now_harvesting() && use_eye_candy && use_harvesting_eye_candy && (harvesting_effect_reference == NULL))
3494 {
3495 actor *act;
3496 LOCK_ACTORS_LISTS();
3497 act = get_actor_ptr_from_id(yourself);
3498 if (act != NULL)
3499 harvesting_effect_reference = ec_create_ongoing_harvesting2(act, 1.0, 1.0, (poor_man ? 6 : 10), 1.0);
3500 UNLOCK_ACTORS_LISTS();
3501 }
3502 }
3503 #endif //!MAP_EDITOR
3504 ///////////////////////////////////////////////////////////////////////////////
3505
3506