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.31 by root, Thu Dec 21 23:37:06 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{
1071 1035
1072 map = va_arg (args, maptile *); 1036 map = va_arg (args, maptile *);
1073 x = va_arg (args, int); 1037 x = va_arg (args, int);
1074 y = va_arg (args, int); 1038 y = va_arg (args, int);
1075 1039
1076 update_position (map, x, y); 1040 map->at (x, y).flags_ |= P_NEED_UPDATE;
1041
1077 va_end (args); 1042 va_end (args);
1078 *type = CFAPI_NONE; 1043 *type = CFAPI_NONE;
1079 return NULL; 1044 return NULL;
1080} 1045}
1081 1046
1129 x = va_arg (args, int); 1094 x = va_arg (args, int);
1130 y = va_arg (args, int); 1095 y = va_arg (args, int);
1131 1096
1132 va_end (args); 1097 va_end (args);
1133 1098
1134 rv = get_map_ob (map, x, y); 1099 rv = GET_MAP_OB (map, x, y);
1135 *type = CFAPI_POBJECT; 1100 *type = CFAPI_POBJECT;
1136 return rv; 1101 return rv;
1137} 1102}
1138 1103
1139void * 1104void *
1676 rv = &op->stats.exp; 1641 rv = &op->stats.exp;
1677 *type = CFAPI_LONG; 1642 *type = CFAPI_LONG;
1678 break; 1643 break;
1679 1644
1680 case CFAPI_OBJECT_PROP_OWNER: 1645 case CFAPI_OBJECT_PROP_OWNER:
1681 rv = get_owner (op); 1646 rv = op->owner;
1682 *type = CFAPI_POBJECT; 1647 *type = CFAPI_POBJECT;
1683 break; 1648 break;
1684 1649
1685 case CFAPI_OBJECT_PROP_PRESENT: 1650 case CFAPI_OBJECT_PROP_PRESENT:
1686 { 1651 {
1728 case CFAPI_OBJECT_PROP_MERGEABLE: 1693 case CFAPI_OBJECT_PROP_MERGEABLE:
1729 { 1694 {
1730 object *op2; 1695 object *op2;
1731 op2 = va_arg (args, object *); 1696 op2 = va_arg (args, object *);
1732 1697
1733 ri = CAN_MERGE (op, op2); 1698 ri = object::can_merge_slow (op, op2);
1734 rv = &ri; 1699 rv = &ri;
1735 } 1700 }
1736 *type = CFAPI_INT; 1701 *type = CFAPI_INT;
1737 break; 1702 break;
1738 1703
1885 rv = &ri; 1850 rv = &ri;
1886 *type = CFAPI_INT; 1851 *type = CFAPI_INT;
1887 break; 1852 break;
1888 1853
1889 case CFAPI_PLAYER_PROP_IP: 1854 case CFAPI_PLAYER_PROP_IP:
1890 rv = op->contr->socket.host; 1855 rv = op->contr->ns->host;
1891 *type = CFAPI_STRING; 1856 *type = CFAPI_STRING;
1892 break; 1857 break;
1893 1858
1894 case CFAPI_PLAYER_PROP_MARKED_ITEM: 1859 case CFAPI_PLAYER_PROP_MARKED_ITEM:
1895 rv = find_marked_object (op); 1860 rv = find_marked_object (op);
2010 player *pl; 1975 player *pl;
2011 1976
2012 op->nrof = iarg; 1977 op->nrof = iarg;
2013 if (op->env != NULL) 1978 if (op->env != NULL)
2014 { 1979 {
2015 tmp = is_player_inv (op->env); 1980 tmp = op->in_player ();
2016 if (!tmp) 1981 if (!tmp)
2017 { 1982 {
2018 for (pl = first_player; pl; pl = pl->next) 1983 for (pl = first_player; pl; pl = pl->next)
2019 if (pl->ob->container == op->env) 1984 if (pl->ob->container == op->env)
2020 break; 1985 break;
2171 player *pl; 2136 player *pl;
2172 2137
2173 op->weight = iarg; 2138 op->weight = iarg;
2174 if (op->env != NULL) 2139 if (op->env != NULL)
2175 { 2140 {
2176 tmp = is_player_inv (op->env); 2141 tmp = op->in_player ();
2177 if (!tmp) 2142 if (!tmp)
2178 { 2143 {
2179 for (pl = first_player; pl; pl = pl->next) 2144 for (pl = first_player; pl; pl = pl->next)
2180 if (pl->ob->container == op->env) 2145 if (pl->ob->container == op->env)
2181 break; 2146 break;
2310 break; 2275 break;
2311 2276
2312 case CFAPI_OBJECT_PROP_OWNER: 2277 case CFAPI_OBJECT_PROP_OWNER:
2313 oparg = va_arg (args, object *); 2278 oparg = va_arg (args, object *);
2314 2279
2315 set_owner (op, oparg); 2280 op->set_owner (oparg);
2316 break; 2281 break;
2317 2282
2318 case CFAPI_OBJECT_PROP_CHEATER: 2283 case CFAPI_OBJECT_PROP_CHEATER:
2319 set_cheat (op); 2284 set_cheat (op);
2320 break; 2285 break;
2455 if (op->contr) 2420 if (op->contr)
2456 { 2421 {
2457 oparg = va_arg (args, object *); 2422 oparg = va_arg (args, object *);
2458 2423
2459 op->contr->mark = oparg; 2424 op->contr->mark = oparg;
2460 if (oparg)
2461 op->contr->mark_count = oparg->count;
2462 } 2425 }
2463 break; 2426 break;
2464 2427
2465 case CFAPI_PLAYER_PROP_PARTY: 2428 case CFAPI_PLAYER_PROP_PARTY:
2466 if (op->contr) 2429 if (op->contr)
2645 op = va_arg (args, object *); 2608 op = va_arg (args, object *);
2646 2609
2647 va_end (args); 2610 va_end (args);
2648 2611
2649 send_removed_object (op); 2612 send_removed_object (op);
2650 remove_ob (op); 2613 op->remove ();
2651 *type = CFAPI_NONE; 2614 *type = CFAPI_NONE;
2652 return NULL; 2615 return NULL;
2653} 2616}
2654 2617
2655void * 2618void *
2662 2625
2663 op = va_arg (args, object *); 2626 op = va_arg (args, object *);
2664 2627
2665 va_end (args); 2628 va_end (args);
2666 2629
2667 free_object (op); 2630 op->destroy ();
2668 2631
2669 *type = CFAPI_NONE; 2632 *type = CFAPI_NONE;
2670 return NULL; 2633 return NULL;
2671} 2634}
2672 2635
2689 *type = CFAPI_POBJECT; 2652 *type = CFAPI_POBJECT;
2690 return object_create_clone (op); 2653 return object_create_clone (op);
2691 } 2654 }
2692 else 2655 else
2693 { 2656 {
2694 object *tmp; 2657 object *tmp = op->clone ();
2695
2696 tmp = get_object ();
2697 copy_object (op, tmp);
2698 *type = CFAPI_POBJECT; 2658 *type = CFAPI_POBJECT;
2699 return tmp; 2659 return tmp;
2700 } 2660 }
2701} 2661}
2702void * 2662void *
2738 break; 2698 break;
2739 2699
2740 case 3: 2700 case 3:
2741 op = va_arg (args, object *); 2701 op = va_arg (args, object *);
2742 2702
2743 rv = is_player_inv (op); 2703 rv = op->in_player ();
2744 break; 2704 break;
2745 2705
2746 default: 2706 default:
2747 rv = NULL; 2707 rv = NULL;
2748 *type = CFAPI_NONE; 2708 *type = CFAPI_NONE;
2766 *type = CFAPI_POBJECT; 2726 *type = CFAPI_POBJECT;
2767 switch (ival) 2727 switch (ival)
2768 { 2728 {
2769 case 0: 2729 case 0:
2770 va_end (args); 2730 va_end (args);
2771 return get_object (); 2731 return object::create ();
2772 break; 2732 break;
2773 2733
2774 case 1: /* Named object. Nearly the old plugin behavior, but we don't add artifact suffixes */ 2734 case 1: /* Named object. Nearly the old plugin behavior, but we don't add artifact suffixes */
2775 { 2735 {
2776 char *sval; 2736 char *sval;
2779 2739
2780 op = get_archetype_by_object_name (sval); 2740 op = get_archetype_by_object_name (sval);
2781 2741
2782 if (strncmp (query_name (op), ARCH_SINGULARITY, ARCH_SINGULARITY_LEN) == 0) 2742 if (strncmp (query_name (op), ARCH_SINGULARITY, ARCH_SINGULARITY_LEN) == 0)
2783 { 2743 {
2784 free_object (op); 2744 op->destroy ();
2785 /* Try with archetype names... */ 2745 /* Try with archetype names... */
2786 op = get_archetype (sval); 2746 op = get_archetype (sval);
2787 if (strncmp (query_name (op), ARCH_SINGULARITY, ARCH_SINGULARITY_LEN) == 0) 2747 if (strncmp (query_name (op), ARCH_SINGULARITY, ARCH_SINGULARITY_LEN) == 0)
2788 { 2748 {
2789 free_object (op); 2749 op->destroy ();
2790 *type = CFAPI_NONE; 2750 *type = CFAPI_NONE;
2791 va_end (args); 2751 va_end (args);
2792 return NULL; 2752 return NULL;
2793 } 2753 }
2794 } 2754 }
2953 2913
2954 op = va_arg (args, object *); 2914 op = va_arg (args, object *);
2955 2915
2956 va_end (args); 2916 va_end (args);
2957 2917
2958 clear_object (op); 2918 op->clear ();
2959 *type = CFAPI_NONE; 2919 *type = CFAPI_NONE;
2960 return NULL; 2920 return NULL;
2961} 2921}
2962 2922
2963void * 2923void *
3263 x = map->enter_x; 3223 x = map->enter_x;
3264 y = map->enter_y; 3224 y = map->enter_y;
3265 } 3225 }
3266 3226
3267/* 3227/*
3268 originator = get_object(); 3228 originator = object::create();
3269 EXIT_PATH(originator) = add_string(map->path); 3229 EXIT_PATH(originator) = add_string(map->path);
3270 EXIT_X(originator) = x; 3230 EXIT_X(originator) = x;
3271 EXIT_Y(originator) = y; 3231 EXIT_Y(originator) = y;
3272 printf("B Transfer: X=%d, Y=%d, OP=%s\n", x, y, op->name);*/ 3232 printf("B Transfer: X=%d, Y=%d, OP=%s\n", x, y, op->name);*/
3273 /*enter_exit(op, originator); */ 3233 /*enter_exit(op, originator); */
3274 insert_ob_in_map_at (op, map, NULL, 0, x, y); 3234 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); 3235 /*printf("A Transfer: X=%d, Y=%d, MAP=%s\n", x, y, op->map->name);
3276 free_object(originator); 3236 originator->destroy ();
3277 */ 3237 */
3278 *type = CFAPI_INT; 3238 *type = CFAPI_INT;
3279 return &rv; 3239 return &rv;
3280 break; 3240 break;
3281 3241
3354 drop (author, op); 3314 drop (author, op);
3355 3315
3356 if (author->type == PLAYER) 3316 if (author->type == PLAYER)
3357 { 3317 {
3358 author->contr->count = 0; 3318 author->contr->count = 0;
3359 author->contr->socket.update_look = 1; 3319 author->contr->ns->floorbox_update ();
3360 } 3320 }
3361 3321
3362 *type = CFAPI_NONE; 3322 *type = CFAPI_NONE;
3363 return NULL; 3323 return NULL;
3364} 3324}
3470 result = 1; 3430 result = 1;
3471 return &result; 3431 return &result;
3472 } 3432 }
3473 3433
3474 send_removed_object (who); 3434 send_removed_object (who);
3475 remove_ob (who); 3435 who->remove ();
3476 3436
3477 for (tmp = who; tmp != NULL; tmp = tmp->more) 3437 for (tmp = who; tmp != NULL; tmp = tmp->more)
3478 tmp->x = x + freearr_x[k] + (tmp->arch == NULL ? 0 : tmp->arch->clone.x), 3438 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); 3439 tmp->y = y + freearr_y[k] + (tmp->arch == NULL ? 0 : tmp->arch->clone.y);
3480 3440

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines