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