ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/server/plugins.C
(Generate patch)

Comparing deliantra/server/server/plugins.C (file contents):
Revision 1.16 by root, Sat Sep 16 22:24:13 2006 UTC vs.
Revision 1.29 by root, Wed Dec 20 09:14:22 2006 UTC

42 42
43static const hook_entry plug_hooks[NR_OF_HOOKS] = { 43static const hook_entry plug_hooks[NR_OF_HOOKS] = {
44 {cfapi_system_register_global_event, 1, "cfapi_system_register_global_event"}, 44 {cfapi_system_register_global_event, 1, "cfapi_system_register_global_event"},
45 {cfapi_system_unregister_global_event, 3, "cfapi_system_unregister_global_event"}, 45 {cfapi_system_unregister_global_event, 3, "cfapi_system_unregister_global_event"},
46 {cfapi_system_check_path, 4, "cfapi_system_check_path"}, 46 {cfapi_system_check_path, 4, "cfapi_system_check_path"},
47 {cfapi_system_re_cmp, 5, "cfapi_system_re_cmp"}, 47 {NULL, 5, "cfapi_system_re_cmp"},
48 {cfapi_system_strdup_local, 6, "cfapi_system_strdup_local"}, 48 {cfapi_system_strdup, 6, "cfapi_system_strdup"},
49 {cfapi_system_directory, 7, "cfapi_system_directory"}, 49 {cfapi_system_directory, 7, "cfapi_system_directory"},
50 {cfapi_system_find_animation, 8, "cfapi_system_find_animation"}, 50 {cfapi_system_find_animation, 8, "cfapi_system_find_animation"},
51 {cfapi_object_clean_object, 9, "cfapi_object_clean_object"}, 51 {cfapi_object_clean_object, 9, "cfapi_object_clean_object"},
52 {cfapi_object_on_same_map, 10, "cfapi_object_on_same_map"}, 52 {cfapi_object_on_same_map, 10, "cfapi_object_on_same_map"},
53 {cfapi_object_get_key, 11, "cfapi_object_get_key"}, 53 {cfapi_object_get_key, 11, "cfapi_object_get_key"},
121 121
122/* NEW PLUGIN STUFF STARTS HERE */ 122/* NEW PLUGIN STUFF STARTS HERE */
123 123
124/*****************************************************************************/ 124/*****************************************************************************/
125 125
126#ifdef WIN32
127static const char *
128plugins_dlerror (void)
129{
130 static char buf[256];
131 DWORD err;
132 char *p;
133
134 err = GetLastError ();
135 if (FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM, NULL, err, 0, buf, sizeof (buf), NULL) == 0)
136 snprintf (buf, sizeof (buf), "error %lu", err);
137 p = strchr (buf, '\0');
138 while (p > buf && (p[-1] == '\r' || p[-1] == '\n'))
139 p--;
140 *p = '\0';
141 return buf;
142}
143#endif /* WIN32 */
144
145/** 126/**
146 * Notify clients about a changed object. 127 * Notify clients about a changed object.
147 * 128 *
148 * @param op the object that has changed 129 * @param op the object that has changed
149 */ 130 */
151send_changed_object (object *op) 132send_changed_object (object *op)
152{ 133{
153 object *tmp; 134 object *tmp;
154 player *pl; 135 player *pl;
155 136
156 if (op->env != NULL) 137 if (op->env)
157 { 138 {
158 tmp = is_player_inv (op->env); 139 tmp = op->in_player ();
140
159 if (!tmp) 141 if (!tmp)
160 { 142 {
161 for (pl = first_player; pl; pl = pl->next) 143 for (pl = first_player; pl; pl = pl->next)
162 if (pl->ob->container == op->env) 144 if (pl->ob->container == op->env)
163 break; 145 break;
146
164 if (pl) 147 if (pl)
165 tmp = pl->ob; 148 tmp = pl->ob;
166 else 149 else
167 tmp = NULL; 150 tmp = NULL;
168 } 151 }
152
169 if (tmp) 153 if (tmp)
170 esrv_send_item (tmp, op); 154 esrv_send_item (tmp, op);
171 } 155 }
172 else 156 else
173 { 157 {
193 { 177 {
194 /* no action necessary: remove_ob() notifies the client */ 178 /* no action necessary: remove_ob() notifies the client */
195 return; 179 return;
196 } 180 }
197 181
198 tmp = is_player_inv (op->env); 182 tmp = op->in_player ();
199 if (!tmp) 183 if (!tmp)
200 { 184 {
201 for (pl = first_player; pl; pl = pl->next) 185 for (pl = first_player; pl; pl = pl->next)
202 if (pl->ob->container == op->env) 186 if (pl->ob->container == op->env)
203 break; 187 break;
501 *type = CFAPI_INT; 485 *type = CFAPI_INT;
502 return &rv; 486 return &rv;
503} 487}
504 488
505void * 489void *
506cfapi_system_strdup_local (int *type, ...) 490cfapi_system_strdup (int *type, ...)
507{ 491{
508 va_list args; 492 va_list args;
509 char *txt; 493 char *txt;
510 494
511 va_start (args, type); 495 va_start (args, type);
512 txt = va_arg (args, char *); 496 txt = va_arg (args, char *);
513 497
514 va_end (args); 498 va_end (args);
515 *type = CFAPI_STRING; 499 *type = CFAPI_STRING;
516 return strdup_local (txt); 500 return strdup (txt);
517} 501}
518 502
519void * 503void *
520cfapi_system_register_global_event (int *type, ...) 504cfapi_system_register_global_event (int *type, ...)
521{ 505{
572 rv = check_path (name, prepend_dir); 556 rv = check_path (name, prepend_dir);
573 557
574 va_end (args); 558 va_end (args);
575 *type = CFAPI_INT; 559 *type = CFAPI_INT;
576 return &rv; 560 return &rv;
577}
578
579void *
580cfapi_system_re_cmp (int *type, ...)
581{
582 va_list args;
583 char *rv;
584 const char *str;
585 const char *regexp;
586
587 va_start (args, type);
588
589 str = va_arg (args, char *);
590 regexp = va_arg (args, char *);
591
592 rv = (char *) re_cmp (str, regexp);
593
594 va_end (args);
595 *type = CFAPI_STRING;
596 return rv;
597} 561}
598 562
599void * 563void *
600cfapi_system_directory (int *type, ...) 564cfapi_system_directory (int *type, ...)
601{ 565{
1129 x = va_arg (args, int); 1093 x = va_arg (args, int);
1130 y = va_arg (args, int); 1094 y = va_arg (args, int);
1131 1095
1132 va_end (args); 1096 va_end (args);
1133 1097
1134 rv = get_map_ob (map, x, y); 1098 rv = GET_MAP_OB (map, x, y);
1135 *type = CFAPI_POBJECT; 1099 *type = CFAPI_POBJECT;
1136 return rv; 1100 return rv;
1137} 1101}
1138 1102
1139void * 1103void *
1676 rv = &op->stats.exp; 1640 rv = &op->stats.exp;
1677 *type = CFAPI_LONG; 1641 *type = CFAPI_LONG;
1678 break; 1642 break;
1679 1643
1680 case CFAPI_OBJECT_PROP_OWNER: 1644 case CFAPI_OBJECT_PROP_OWNER:
1681 rv = get_owner (op); 1645 rv = op->owner;
1682 *type = CFAPI_POBJECT; 1646 *type = CFAPI_POBJECT;
1683 break; 1647 break;
1684 1648
1685 case CFAPI_OBJECT_PROP_PRESENT: 1649 case CFAPI_OBJECT_PROP_PRESENT:
1686 { 1650 {
1728 case CFAPI_OBJECT_PROP_MERGEABLE: 1692 case CFAPI_OBJECT_PROP_MERGEABLE:
1729 { 1693 {
1730 object *op2; 1694 object *op2;
1731 op2 = va_arg (args, object *); 1695 op2 = va_arg (args, object *);
1732 1696
1733 ri = CAN_MERGE (op, op2); 1697 ri = object::can_merge_slow (op, op2);
1734 rv = &ri; 1698 rv = &ri;
1735 } 1699 }
1736 *type = CFAPI_INT; 1700 *type = CFAPI_INT;
1737 break; 1701 break;
1738 1702
1885 rv = &ri; 1849 rv = &ri;
1886 *type = CFAPI_INT; 1850 *type = CFAPI_INT;
1887 break; 1851 break;
1888 1852
1889 case CFAPI_PLAYER_PROP_IP: 1853 case CFAPI_PLAYER_PROP_IP:
1890 rv = op->contr->socket.host; 1854 rv = op->contr->socket->host;
1891 *type = CFAPI_STRING; 1855 *type = CFAPI_STRING;
1892 break; 1856 break;
1893 1857
1894 case CFAPI_PLAYER_PROP_MARKED_ITEM: 1858 case CFAPI_PLAYER_PROP_MARKED_ITEM:
1895 rv = find_marked_object (op); 1859 rv = find_marked_object (op);
2010 player *pl; 1974 player *pl;
2011 1975
2012 op->nrof = iarg; 1976 op->nrof = iarg;
2013 if (op->env != NULL) 1977 if (op->env != NULL)
2014 { 1978 {
2015 tmp = is_player_inv (op->env); 1979 tmp = op->in_player ();
2016 if (!tmp) 1980 if (!tmp)
2017 { 1981 {
2018 for (pl = first_player; pl; pl = pl->next) 1982 for (pl = first_player; pl; pl = pl->next)
2019 if (pl->ob->container == op->env) 1983 if (pl->ob->container == op->env)
2020 break; 1984 break;
2171 player *pl; 2135 player *pl;
2172 2136
2173 op->weight = iarg; 2137 op->weight = iarg;
2174 if (op->env != NULL) 2138 if (op->env != NULL)
2175 { 2139 {
2176 tmp = is_player_inv (op->env); 2140 tmp = op->in_player ();
2177 if (!tmp) 2141 if (!tmp)
2178 { 2142 {
2179 for (pl = first_player; pl; pl = pl->next) 2143 for (pl = first_player; pl; pl = pl->next)
2180 if (pl->ob->container == op->env) 2144 if (pl->ob->container == op->env)
2181 break; 2145 break;
2310 break; 2274 break;
2311 2275
2312 case CFAPI_OBJECT_PROP_OWNER: 2276 case CFAPI_OBJECT_PROP_OWNER:
2313 oparg = va_arg (args, object *); 2277 oparg = va_arg (args, object *);
2314 2278
2315 set_owner (op, oparg); 2279 op->set_owner (oparg);
2316 break; 2280 break;
2317 2281
2318 case CFAPI_OBJECT_PROP_CHEATER: 2282 case CFAPI_OBJECT_PROP_CHEATER:
2319 set_cheat (op); 2283 set_cheat (op);
2320 break; 2284 break;
2455 if (op->contr) 2419 if (op->contr)
2456 { 2420 {
2457 oparg = va_arg (args, object *); 2421 oparg = va_arg (args, object *);
2458 2422
2459 op->contr->mark = oparg; 2423 op->contr->mark = oparg;
2460 if (oparg)
2461 op->contr->mark_count = oparg->count;
2462 } 2424 }
2463 break; 2425 break;
2464 2426
2465 case CFAPI_PLAYER_PROP_PARTY: 2427 case CFAPI_PLAYER_PROP_PARTY:
2466 if (op->contr) 2428 if (op->contr)
2645 op = va_arg (args, object *); 2607 op = va_arg (args, object *);
2646 2608
2647 va_end (args); 2609 va_end (args);
2648 2610
2649 send_removed_object (op); 2611 send_removed_object (op);
2650 remove_ob (op); 2612 op->remove ();
2651 *type = CFAPI_NONE; 2613 *type = CFAPI_NONE;
2652 return NULL; 2614 return NULL;
2653} 2615}
2654 2616
2655void * 2617void *
2662 2624
2663 op = va_arg (args, object *); 2625 op = va_arg (args, object *);
2664 2626
2665 va_end (args); 2627 va_end (args);
2666 2628
2667 free_object (op); 2629 op->destroy ();
2668 2630
2669 *type = CFAPI_NONE; 2631 *type = CFAPI_NONE;
2670 return NULL; 2632 return NULL;
2671} 2633}
2672 2634
2689 *type = CFAPI_POBJECT; 2651 *type = CFAPI_POBJECT;
2690 return object_create_clone (op); 2652 return object_create_clone (op);
2691 } 2653 }
2692 else 2654 else
2693 { 2655 {
2694 object *tmp; 2656 object *tmp = op->clone ();
2695
2696 tmp = get_object ();
2697 copy_object (op, tmp);
2698 *type = CFAPI_POBJECT; 2657 *type = CFAPI_POBJECT;
2699 return tmp; 2658 return tmp;
2700 } 2659 }
2701} 2660}
2702void * 2661void *
2738 break; 2697 break;
2739 2698
2740 case 3: 2699 case 3:
2741 op = va_arg (args, object *); 2700 op = va_arg (args, object *);
2742 2701
2743 rv = is_player_inv (op); 2702 rv = op->in_player ();
2744 break; 2703 break;
2745 2704
2746 default: 2705 default:
2747 rv = NULL; 2706 rv = NULL;
2748 *type = CFAPI_NONE; 2707 *type = CFAPI_NONE;
2766 *type = CFAPI_POBJECT; 2725 *type = CFAPI_POBJECT;
2767 switch (ival) 2726 switch (ival)
2768 { 2727 {
2769 case 0: 2728 case 0:
2770 va_end (args); 2729 va_end (args);
2771 return get_object (); 2730 return object::create ();
2772 break; 2731 break;
2773 2732
2774 case 1: /* Named object. Nearly the old plugin behavior, but we don't add artifact suffixes */ 2733 case 1: /* Named object. Nearly the old plugin behavior, but we don't add artifact suffixes */
2775 { 2734 {
2776 char *sval; 2735 char *sval;
2779 2738
2780 op = get_archetype_by_object_name (sval); 2739 op = get_archetype_by_object_name (sval);
2781 2740
2782 if (strncmp (query_name (op), ARCH_SINGULARITY, ARCH_SINGULARITY_LEN) == 0) 2741 if (strncmp (query_name (op), ARCH_SINGULARITY, ARCH_SINGULARITY_LEN) == 0)
2783 { 2742 {
2784 free_object (op); 2743 op->destroy ();
2785 /* Try with archetype names... */ 2744 /* Try with archetype names... */
2786 op = get_archetype (sval); 2745 op = get_archetype (sval);
2787 if (strncmp (query_name (op), ARCH_SINGULARITY, ARCH_SINGULARITY_LEN) == 0) 2746 if (strncmp (query_name (op), ARCH_SINGULARITY, ARCH_SINGULARITY_LEN) == 0)
2788 { 2747 {
2789 free_object (op); 2748 op->destroy ();
2790 *type = CFAPI_NONE; 2749 *type = CFAPI_NONE;
2791 va_end (args); 2750 va_end (args);
2792 return NULL; 2751 return NULL;
2793 } 2752 }
2794 } 2753 }
2953 2912
2954 op = va_arg (args, object *); 2913 op = va_arg (args, object *);
2955 2914
2956 va_end (args); 2915 va_end (args);
2957 2916
2958 clear_object (op); 2917 op->clear ();
2959 *type = CFAPI_NONE; 2918 *type = CFAPI_NONE;
2960 return NULL; 2919 return NULL;
2961} 2920}
2962 2921
2963void * 2922void *
3263 x = map->enter_x; 3222 x = map->enter_x;
3264 y = map->enter_y; 3223 y = map->enter_y;
3265 } 3224 }
3266 3225
3267/* 3226/*
3268 originator = get_object(); 3227 originator = object::create();
3269 EXIT_PATH(originator) = add_string(map->path); 3228 EXIT_PATH(originator) = add_string(map->path);
3270 EXIT_X(originator) = x; 3229 EXIT_X(originator) = x;
3271 EXIT_Y(originator) = y; 3230 EXIT_Y(originator) = y;
3272 printf("B Transfer: X=%d, Y=%d, OP=%s\n", x, y, op->name);*/ 3231 printf("B Transfer: X=%d, Y=%d, OP=%s\n", x, y, op->name);*/
3273 /*enter_exit(op, originator); */ 3232 /*enter_exit(op, originator); */
3274 insert_ob_in_map_at (op, map, NULL, 0, x, y); 3233 insert_ob_in_map_at (op, map, NULL, 0, x, y);
3275 /*printf("A Transfer: X=%d, Y=%d, MAP=%s\n", x, y, op->map->name); 3234 /*printf("A Transfer: X=%d, Y=%d, MAP=%s\n", x, y, op->map->name);
3276 free_object(originator); 3235 originator->destroy ();
3277 */ 3236 */
3278 *type = CFAPI_INT; 3237 *type = CFAPI_INT;
3279 return &rv; 3238 return &rv;
3280 break; 3239 break;
3281 3240
3354 drop (author, op); 3313 drop (author, op);
3355 3314
3356 if (author->type == PLAYER) 3315 if (author->type == PLAYER)
3357 { 3316 {
3358 author->contr->count = 0; 3317 author->contr->count = 0;
3359 author->contr->socket.update_look = 1; 3318 author->contr->socket->floorbox_update ();
3360 } 3319 }
3361 3320
3362 *type = CFAPI_NONE; 3321 *type = CFAPI_NONE;
3363 return NULL; 3322 return NULL;
3364} 3323}
3470 result = 1; 3429 result = 1;
3471 return &result; 3430 return &result;
3472 } 3431 }
3473 3432
3474 send_removed_object (who); 3433 send_removed_object (who);
3475 remove_ob (who); 3434 who->remove ();
3476 3435
3477 for (tmp = who; tmp != NULL; tmp = tmp->more) 3436 for (tmp = who; tmp != NULL; tmp = tmp->more)
3478 tmp->x = x + freearr_x[k] + (tmp->arch == NULL ? 0 : tmp->arch->clone.x), 3437 tmp->x = x + freearr_x[k] + (tmp->arch == NULL ? 0 : tmp->arch->clone.x),
3479 tmp->y = y + freearr_y[k] + (tmp->arch == NULL ? 0 : tmp->arch->clone.y); 3438 tmp->y = y + freearr_y[k] + (tmp->arch == NULL ? 0 : tmp->arch->clone.y);
3480 3439

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines